我正在创建一个具有服务器和多个客户端的游戏。 我正在使用 Kryonet 进行网络连接,每个连接都有自己的监听器,用于接收数据包。
在后台调用监听器 Kryonet线程,我不能阻止它们,因为它会影响所有用户。
我已经创建了我的数据库,在同步单例类中配置了一个连接池:
private static final BasicDataSource dataSource = new BasicDataSource();
static {
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://111.111.111.111/db");
dataSource.setUsername("server");
dataSource.setPassword("serverpass");
}
public Connection getConnection() throws SQLException {
return dataSource.getConnection();
}
现在我需要执行一些查询。 我的问题来了。正如我们所知,查询可能需要很长时间才能返回结果,因此在“Kryonet”线程上执行它是完全 Not Acceptable (当接收到数据包时)。 例如,当用户发送他的“RegistrationPacket”时,我需要查询数据库并在数据包中返回结果。当我收到数据包时,我需要将它放在后台,然后从那里将结果发送给客户端。
我的问题来了: 如何处理使用 Java 在后台进行数据库查询?
我应该使用执行器吗?线程?据我所知,为每个连接打开一个线程是一个坏主意,(导致 200 多个工作人员).equals(灾难)。如果有人可以帮助我,我将不胜感激! :)
最佳答案
与 jasync-sql你可以这样做:
// Connect to DB
Connection connection = new MySQLConnection(
new Configuration(
"server",
"111.111.111.111",
3306,
"serverpass",
"db"
)
);
CompletableFuture<?> connectFuture = connection.connect()
// Wait for connection to be ready
// ...
// Execute query
CompletableFuture<QueryResult> future = connection.sendPreparedStatement("select 0");
// Close the connection
connection.disconnect().get()
查看有关库本身的更多详细信息。它是一个基于 Netty 的异步 MySQL 驱动程序。
关于java - Java中的Mysql。如何实现高效的异步查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39935730/