【问题标题】:Using Prepared Statements and Connection Pooling together in MySQL在 MySQL 中一起使用准备好的语句和连接池
【发布时间】:2010-10-23 06:50:03
【问题描述】:

目前,对于每个查询,都会创建并重复使用准备好的语句。我没有使用任何连接池。 C3P0 是一个被广泛推荐的库。

但是,PreparedStatement 与连接绑定。在池化环境中,连接被返回到池中,从而有效地使 PreparedStatement 不可用。我对这个结论是否正确?有什么办法可以同时使用 Prepared Statement 和连接池?

更新:这是独立的应用程序。所以,我不能使用框架来获得正确的连接池。

【问题讨论】:

  • 错误的结论 - 你会得到每个连接池的准备好的语句,所以是的,你需要更长的时间才能开始从缓存中受益,因为你需要先等到连接饱和,但这并没有不要让它们无法使用。

标签: java mysql connection-pooling prepared-statement


【解决方案1】:

我相信如果您关闭连接,PreparedStatement 将“丢失”,但只要相同的连接保持打开状态,相同的 PreparedStatement 就应该可用。您应该查看 Spring 使用 JdbcTemplate 为您执行此操作。它将抽象出所有这些,因此您不必担心。只需传递一个 DataSource 即可。

以下是如何将 c3p0 用作 DataSource 对象:http://forum.springframework.org/showthread.php?t=13078

然后您可以创建一个 JdbcTemplate bean 并将数据源作为构造函数参数传递,然后将 JdbcTemplate 注入您正在使用的任何 DAO 对象中。

【讨论】:

    【解决方案2】:

    这取决于您使用的池化机制。大多数 Java EE 应用服务器都有连接池实现,其中有一个准备好的语句缓存以及池中的每个连接。所以准备好的语句和连接一样被重用。我不知道任何具有此功能的独立池机制。

    【讨论】:

      【解决方案3】:

      当我从“高性能 MySQL”中看到this material 时,我觉得您必须对 MySQL 配置做一些超出您在 Java 中设置的任何事情的事情。您是否编辑了 my.cnf 文件?

      另外,你看过other SO questions这个话题吗?

      编辑:Spring 是一个有助于池化的框架,非常适合独立应用程序。

      【讨论】:

      • 我检查了你提到的问题。我希望在用尽通用解决方案的所有选项(即连接池、准备好的语句)之后调整 db 特定参数。
      猜你喜欢
      • 1970-01-01
      • 2011-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多