我有以下hibernate查询:
Query query = session.createQuery("from MyHibernateClass");
List<MyHibernateClass> result = query.list();// executes in 7000ms
Run Code Online (Sandbox Code Playgroud)
当我在MySQL中记录正在执行的sql时,我看到了
select
myhibernat0_.myFirstColumn as myfirstcolumn92_,
myhibernat0_.mySecondColumn as mysecondcolumn92_,
myhibernat0_.mythirdcolumn as mythirdcolumn92_,
myhibernat0_.myFourthColumn as myfourthcolumn92_
from MyHibernateClass myhibernat0_
where (1=1);
Run Code Online (Sandbox Code Playgroud)
当在MyHibernateClass数据库表中的3500行的小数据集上测量jvm中的java代码时,这需要大约7000ms.
如果我在另一方面使用直接jdbc如下:
Statement statement = session.connection().createStatement();
ResultSet rs = statement.executeQuery("select * from MyHibernateClass");// 7ms
List<MyHibernateClass> result = convert(rs);// executes in 20ms
Run Code Online (Sandbox Code Playgroud)
我看到相同的sql进入数据库,但现在jvm中java代码的花费时间是7ms.
MyHibernateClass是一个带有getter和setter的简单java bean类,我没有使用特殊的resulttransformers,如示例中所示.我只需要该类的只读实例,并且不需要附加到hibernate会话.
我宁愿使用hibernate版本但不能接受执行时间.
补充信息:添加hibernate日志后我看到了
[2011-07-07 14:26:26,643]DEBUG [main] [logid: ] -
org.hibernate.jdbc.AbstractBatcher.logOpenResults(AbstractBatcher.java:426) -
about to open ResultSet (open ResultSets: 0, globally: 0)
Run Code Online (Sandbox Code Playgroud)
接下来是3500条以下日志语句
[2011-07-07 14:26:26,649]DEBUG [main] …Run Code Online (Sandbox Code Playgroud) 我正在使用Glassfish v2.1.1,MySQL 5.1和ActiveMQ 5.4.2 incl.它的资源适配器.如果ActiveMQ资源适配器在参与包括数据库和jms事务的XATransaction时抛出异常,则glassfish将包含处于回滚状态的事务,该事务不会释放与数据库连接池的数据库连接.这些事务将堆积起来并最终使数据库连接池饱和.
这里发生了什么以及如何防止这些事务在挂起到数据库连接的回滚状态中停止?
最好的问候Trym
activemq-classic database-connection transactions glassfish connection-leaks