java - JDBC并发实现

标签 java mysql jdbc concurrency

我正在从套接字接收数据。我的 ServerSocket 为每个新请求创建一个新线程。然后需要将数据上传到MySQL数据库。数据库连接和所有必需的准备语句已预先创建。

嗯,我想同时处理所有请求。这是否意味着我需要与数据库建立多个连接?我正在考虑池连接,但准备好的语句必须在应用程序启动时仅创建一次。

实现该目标以获得最佳性能的最佳方法是什么?

如果我用 Oracle 替换我的数据库会怎样。我应该使用多个连接吗? Tom Kyte 在其书的第一章中呼吁仅使用与 Oracle 数据库的一个连接,而 MS SQLServer 则使用多个连接。这是否意味着我可以仅使用一个连接执行多个语句?

最佳答案

您需要带有缓存连接的连接池以了解更多详细信息,您可以查看 http://en.wikipedia.org/wiki/Connection_pool 。您可以缓存准备好的语句,并在每次执行后清除参数。 为了获得最佳性能,您需要使用线程池,也不需要为每个新请求创建一个新线程。 我认为您可以创建一些准备好的语句池,并通过某个键检索它们(您可以定义查询的键)。 类似这样的事情:

public class StatementPool{

  HashMap<String, Queue<Statement>> statementsPoolMap = ...
  public Statement getStatementByKey(String key){ // you can define keys for queries

     Queue<Statement> queue = statementsPoolMap.get (key); 
     Statement statement = null;
     if(queue.isEmpty()){
       Statement st =  connectionPool.getConnection().prepareStatement();
       ... 
     }else{
       statement = queue.poll();
     }
     ...
     return statement
  }

}

关于java - JDBC并发实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8110587/

相关文章:

java - 自定义Android Webview类

java - Celery 管理 java 任务

java - 使用类加载器隔离静态单例类

mysql - Postgresql 中用户权限的最佳实践?

PHP 和 PDO 类

java - Spring Jms 每秒发出警告消息

mysql - 更新语句不按条件过滤,使用MySQL默认为 "else"

java - JFrame 显示不正确

java - 获取 Teradata 数据源连接时出现异常

mysql - 如何为 mariadb 连接器配置 jdbc 回退