当前位置: 首页 > 面试题库 >

我是否正确使用Java PooledConnections?

楚奇逸
2023-03-14
问题内容

我想在Java中使用池化连接(因为每个线程创建一个连接非常昂贵),所以我正在使用该MysqlConnectionPoolDataSource()对象。我正在跨线程保留我的数据源。因此,我在整个应用程序中仅使用一个数据源,如下所示:

  startRegistry();    // creates an RMI registry for MySQL
  MysqlConnectionPoolDataSource dataSource = new MysqlConnectionPoolDataSource();
  dataSource.setUser("username");
  dataSource.setPassword("password");
  dataSource.setServerName("serverIP");
  dataSource.setPort(3306);
  dataSource.setDatabaseName("dbname");

  InitialContext context = createContext();   // Creates a context
  context.rebind("MySQLDS", dataSource);

现在,我已经创建了数据源,然后在每个单独的线程中执行以下操作:

  PooledConnection connect = dataSource.getPooledConnection();
  Connection sqlConnection = connect.getConnection();

  Statement state = sqlConnection.createStatement();

  ResultSet result = state.executeQuery("select * from someTable");
  // Continue processing results

我猜我很困惑,dataSource.getPooledConnection();
这真的 是在 获取池连接吗?
这个线程安全吗?我注意到PooledConnection具有诸如notify()和wait()之类的方法…这意味着我不认为它在做我认为在做的事情…

另外,何时以及如何释放连接?

我想知道如果自己动手滚动会更有益,因为那样的话我会更加熟悉,但是在这种情况下,我真的不想重新发明轮子。

非常感谢


问题答案:

这不是正确的方法。数据源需要由在其中运行应用程序的任何容器进行管理。MysqlConnectionPoolDataSource不是
连接池。它只是javax.sql.DataSource接口的具体实现。您通常在JNDI上下文中定义它,然后从那里获取它。MySQL本身也在其文档中明确声明了所有内容。

现在,如何使用它取决于应用程序的目的。如果它是一个Web应用程序,那么您需要参考所涉及的servlet容器/应用服务器的JNDI资源文档。例如,如果是Tomcat,则可以在此处找到它。如果您正在运行客户端应用程序-我将高度质疑连接池的价值-
那么您需要寻找一个连接池框架,该框架可以利用MySQL提供的连接池数据源,例如C3P0。

您发布的代码的另一个问题是PooledConnection#getConnection()将会返回 基础 连接,因此它 不是
池化连接。调用close不会将连接返回到池,而只是真正关闭它。池必须每次都创建一个新的连接。

然后是线程安全的故事,这取决于所讨论的 实际 连接池框架。C3P0已经证明了它的坚固性在几年,你不用担心,只要你写根据标准成语JDBC代码,即使用
在JDBC接口和采集 ,并 关闭所有资源(ConnectionStatementResultSet在最短的范围内)。



 类似资料:
  • 在我的JavaSpringMVC应用程序中,我有一个返回用户的DAO。DAO经常被命中,所以我尝试缓存用户。 我是这样做的(如下),但我不知道我是否做对了。 我在想使得它只运行一次,并且所有其他时间的值都将从缓存中加载。 和上的和会在发生更新或删除时清除缓存。 那是正确的吗?如果是,什么时候使用合适?

  • 使用Fork-Join框架的资源,创建一个同步多线程系统,从三个文本文件中形成一个最大长度的单词集合。不要使用中间集合来读取文本。在本例中,工作由存储在MaxLengthWord类的arr字段中的数组表示。createSubtasks()方法递归地将任务分成更小的工作部分,直到每个工作部分都小于阈值。

  • 问题内容: 如果我正确使用通道,是否需要使用互斥锁来防止并发访问? 问题答案: 如果正确使用通道,则不需要互斥。在某些情况下,使用互斥锁的解决方案可能会更简单。 只需确保包含通道值的变量已正确初始化,然后使用多个goroutine尝试访问通道变量即可。一旦完成,按设计访问通道(例如,向它们发送值或从中接收值)是安全的。 带有参考文献的证明文件(重点由我添加): 规格:渠道类型: 单个信道 ,可以使

  • 我熟悉在一个账户和另一个账户之间转账时使用同步的并发示例,例如,两个账户的锁定是按账号顺序进行的,这样就不会发生死锁。 我想探索使用Reenter antReadWriteLock,因为在我看来,这将允许帐户对象的客户端进行并发读取,前提是没有客户端更新该对象。 我已经编写了代码并对其进行了测试,它似乎可以工作,但看起来有点难看,例如,Account类暴露其锁对象看起来有点奇怪,但它似乎必须这样做

  • 问题内容: 由于对设计模式和体系结构不熟悉,我很难向他人确切说明我的最新应用程序是如何设计的。我已经在认为它是纯n层,纯MVC和表示层中具有MVC的n层之间切换。目前,我认为后者是正确的,但我希望更多有经验的开发人员能有所作为。 浏览器将HTTP请求发送到Tomcat。通过web.xml将请求映射到servlet(我称为控制器) 控制器实例化一个或多个业务对象并在其上调用方法,即,该对象将在调用一

  • 作者(AuthorID、AuthorName、Address、TelephoneNo、PublisherCode) 写一个查询,挑出并显示去年出书的作者的所有详细信息。 这是我回答的mysql查询,我想知道它是正确的还是有更好的方法写它?