获取Hibernate的当前连接数

对于ssh开发,一旦出现:

 org.apache.commons.dbcp.SQLNestedException: Cannot get a connection, pool error Timeout waiting for idle object

这样的错误,是很纠结了。意思是你连接池满了。此时最好能监视当前的连接数,这样调试起来要方便很多。一种方法是查看Oracle数据库的系统表v$session,这张表保存当前的每一个数据库连接。但这里的连接实连接,有时HIbernate的连接池满不是实连接的问题,而是dataSource维护的连接满了。例如,我的Hibernate的dataSource使用Spring管理,配置如下:

<bean id="dataSource"
 class="org.apache.commons.dbcp.BasicDataSource"
 destroy-method="close">
 <property name="driverClassName">
  <value>oracle.jdbc.driver.OracleDriver</value>
 </property>
 <property name="url">
  <value>jdbc:oracle:thin:@127.0.0.1:1521:orcl</value>
 </property>
 <property name="username">
  <value>xxx</value>
 </property>
 <property name="password">
  <value>xxx</value>
 </property>  
 <property name="maxActive">
  <value>100</value>
 </property>
 <property name="maxWait">
  <value>3000</value>
 </property>
 <property name="maxIdle">
  <value>20</value>
 </property>
</bean>

注意这里的maxActive参数,它就是数据源的最大连接数,一旦当前连接数达到此阈值,后来的连接请求必须排队。所以一方面可以通过修改此阈值提高系统效率。

言归正传,如果要获取当前的连接数,可以先获取此bean,然后访问他的numActive数据就可以获取当前连接数了。示例代码如下:
BasicDataSource dataSource = (BasicDataSource)SpringTools.getBean("dataSource");
System.out.println(dataSource.getNumActive());

就是这么简单,但是网上却很难找到,呵呵。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Hibernate 中,可以使用 HQL 或者 Criteria API 来进行内外连接查询。 1. 内连接查询 内连接查询可以使用 HQL 或者 Criteria API 来实现。以下是 HQL 的示例: ```java String hql = "select c.name, o.orderNumber from Customer c inner join c.orders o where c.name like '%John%'"; Query query = session.createQuery(hql); List<Object[]> results = query.list(); for(Object[] row : results) { String customerName = (String) row[0]; String orderNumber = (String) row[1]; // do something with the result } ``` 以上 HQL 查询使用了 `inner join` 关键字。在这里,我们查询了所有名字包含 "John" 的客户及其所有订单号。 以下是 Criteria API 的示例: ```java CriteriaBuilder builder = session.getCriteriaBuilder(); CriteriaQuery<Object[]> query = builder.createQuery(Object[].class); Root<Customer> customer = query.from(Customer.class); Join<Customer, Order> order = customer.join("orders", JoinType.INNER); query.multiselect(customer.get("name"), order.get("orderNumber")); query.where(builder.like(customer.get("name"), "%John%")); List<Object[]> results = session.createQuery(query).getResultList(); for(Object[] row : results) { String customerName = (String) row[0]; String orderNumber = (String) row[1]; // do something with the result } ``` 以上 Criteria API 查询使用了 `join` 方法,并指定了 `JoinType.INNER` 来进行内连接查询。在这里,我们查询了所有名字包含 "John" 的客户及其所有订单号。 2. 外连接查询 外连接查询同样可以使用 HQL 或者 Criteria API 来实现。以下是 HQL 的示例: ```java String hql = "select c.name, o.orderNumber from Customer c left join c.orders o"; Query query = session.createQuery(hql); List<Object[]> results = query.list(); for(Object[] row : results) { String customerName = (String) row[0]; String orderNumber = (String) row[1]; // do something with the result } ``` 以上 HQL 查询使用了 `left join` 关键字。在这里,我们查询了所有客户及其所有订单号,如果客户没有订单则订单号为 null。 以下是 Criteria API 的示例: ```java CriteriaBuilder builder = session.getCriteriaBuilder(); CriteriaQuery<Object[]> query = builder.createQuery(Object[].class); Root<Customer> customer = query.from(Customer.class); Join<Customer, Order> order = customer.join("orders", JoinType.LEFT); query.multiselect(customer.get("name"), order.get("orderNumber")); List<Object[]> results = session.createQuery(query).getResultList(); for(Object[] row : results) { String customerName = (String) row[0]; String orderNumber = (String) row[1]; // do something with the result } ``` 以上 Criteria API 查询同样使用了 `join` 方法,并指定了 `JoinType.LEFT` 来进行左外连接查询。在这里,我们查询了所有客户及其所有订单号,如果客户没有订单则订单号为 null。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值