java - Java中的Mysql。如何实现高效的异步查询?

标签 java mysql multithreading kryonet

我正在创建一个具有服务器和多个客户端的游戏。 我正在使用 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/

相关文章:

java - java中字符串的快速参数函数

mysql按带空格的列名排序

javascript - 用PHP连接MySQL却通过JS查询MySQL?

java - 为什么 `ExecutorService`不能一致地调度线程?

c++ - 如何实时监控不同的 OpenMP 线程?

java - 如何从 JSON 数据在编辑文本字段中设置文本

java - 数据库中的坐标比较

java - 服务器端请求伪造漏洞

mysql - MariaDB 存储过程生成不清楚的错误,出了什么问题?

python - 如何独立单步执行 Python 线程? (WinPDB)