我想在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接口和采集 ,并 关闭所有资源(Connection
,Statement
并ResultSet
在最短的范围内)。
在我的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查询,我想知道它是正确的还是有更好的方法写它?