我正在使用hibernate和c3p0作为数据库,我有一个带有ThreadPoolExecutor的java应用程序。 我正在做的是,我正在征服每个与hibernate相关的不同任务,使用Transactions和getCurrentSession来使用Hibernate存储数据。 所以我有
new ThreadPoolExecutor(CORE_POOL_SIZE, MAX_POOL_SIZE, KEEP_ALIVE_TIME, TimeUnit.MINUTES,taskQueue);
Runnable
{
@Override
public void run() {
Session session = HibernateDAO.getInstance().getCurrentSession();
Transaction tx = null;
try
{tx = session.beginTransaction(); .....
}
和hibernate.cfg 线 org.hibernate.connection.C3P0ConnectionProvider 1
<!-- Database c3p0 settings -->
<property name="hibernate.c3p0.min_size">3</property>
<property name="hibernate.c3p0.max_size">3</property>
<property name="hibernate.c3p0.initialPoolSize">3</property>
<property name="hibernate.c3p0.max_statements">100</property>
<property name="hibernate.c3p0.timeout">5000</property>
<property name="hibernate.c3p0.acquire_increment">2</property>
我的目标是从执行程序获取每个线程,使用getCurrentSession获取连接,并执行session.saveOrUpdate(item), 现在我有几个问题。 我应该使用哪种隔离级别,因为我有95%的写入/更新和5%的读取,并且读取不会被写入中断。 我从log4j
进入HTML日志905 pool-1-thread-1 DEBUG com.mchange.v2.resourcepool.BasicResourcePool trace com.mchange.v2.resourcepool.BasicResourcePool@434cb775 [managed: 3, unused: 0, excluded: 0] (e.g. com.mchange.v2.c3p0.impl.NewPooledConnection@697506e6)
905 pool-1-thread-5 DEBUG com.mchange.v2.resourcepool.BasicResourcePool trace com.mchange.v2.resourcepool.BasicResourcePool@434cb775 [managed: 3, unused: 0, excluded: 0] (e.g. com.mchange.v2.c3p0.impl.NewPooledConnection@697506e6)
965 pool-1-thread-4 DEBUG com.mchange.v2.resourcepool.BasicResourcePool trace com.mchange.v2.resourcepool.BasicResourcePool@434cb775 [managed: 3, unused: 0, excluded: 0] (e.g. com.mchange.v2.c3p0.impl.NewPooledConnection@697506e6)
这是否意味着我在c3p0中只有一个连接,或者一个池中有多个连接?
AM我应该使用它,因为它应该被使用????
什么级别的隔离最适合并发写入?
提前感谢所有人,如果有人需要更多的数据和解释只是戳。
- 编辑:回答
根据答案的建议,我已经检查了mysql服务器管理员,并且还有更多的连接用于查询..所以这是使用它的正确方法:D ... 至于隔离级别,我试着让
答案 0 :(得分:1)
这意味着您有一个包含3个初始连接的池。您应该能够确认这一点,看看您的SQL服务器监视器。
请记住,您的SQL服务器配置胜过C3PO,因此如果您有多个线程在同一个表上竞争事务,您可能会发现您的写入/更新操作被阻止,无论您的池配置如何。
您可能会发现在单个事务中批量插入/更新可能会比将它们移动到单独的线程提供更好的性能提升。 This article一个有趣的读物。
至于指定隔离级别,我的理解是这更像是读取性能而不是写入的问题。我从未发现自己处于需要READ COMMITTED
以下的任何情况,因为允许使用READ UNCOMMITTED
的脏读取完全抹杀了首先使用ACID数据库的优势。但是,我不是这个领域的专家,其他人可能会有不同的意见。如果您真的关心这一点,我会根据您选择的数据库对这两个设置进行基准测试,以确定可以获得多少性能。