我有以下方法每隔几秒插入一大批记录。运行一段时间后,我得到如下错误:
错误:通讯链接失败
从服务器成功收到的最后一个数据包是523 几毫秒之前。成功发送到服务器的最后一个数据包是 8毫秒之前。
2013年5月16日上午9:48:30 com.mchange.v2.c3p0.stmt.GooGooStatementCache checkinStatement INFO:签入声明的问题,丢弃。
com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: 声明结束后不允许任何操作。
我用来打开和关闭连接的代码如下:
public DataControllerImp() {
session = HibernateUtil.getSessionFactory().openSession();
}
@Override
public void saveMessage(ArrayList<Message> messages) {
Transaction tx = session.beginTransaction();
for (int i = 0; i < mesages.size(); i++) {
Message message = messages.get(i);
try {
session.save(message);
if (i % 75 == 0) {
// flush a batch of inserts and release memory:
session.flush();
session.clear();
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
session.close();
}
}
tx.commit();
}
我也在使用c3p0连接池。我的配置如下:
<property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
<property name="hibernate.c3p0.acquire_increment">1</property>
<property name="hibernate.c3p0.idle_test_period">300</property>
<property name="hibernate.c3p0.min_size">3</property>
<property name="hibernate.c3p0.max_size">20</property>
<property name="hibernate.c3p0.max_statements">50</property>
<property name="hibernate.c3p0.timeout">300</property>
<property name="hibernate.c3p0.acquireRetryAttempts">1</property>
<property name="hibernate.c3p0.acquireRetryDelay">250</property>
我是否错误地打开和关闭连接?请让我知道我可以改变什么来阻止接收此错误并停止我的程序。
答案 0 :(得分:2)
Transaction tx = session.beginTransaction();
try {
for (int i = 0; i < mesages.size(); i++) {
Message message = messages.get(i);
session.save(message);
if (i % 75 == 0) {
// flush a batch of inserts and release memory:
session.flush();
session.clear();
}
}
tx.commit();
}catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
tx.rollBack();
}finally{
session.close();
}
}
答案 1 :(得分:0)
而是为任何对象类型创建泛型方法并传递该对象。添加任何List的逻辑。
public void save(Object obj) {
Session session = null;
Transaction transaction = null;
try {
session = sessionFactory.getCurrentSession();
transaction = session.beginTransaction();
session.save(obj);
session.flush();
transaction.commit();
} catch (JDBCException jde) {
logger.fatal("Error occured in database communication", jde);
transaction.rollback();
throw new RuntimeException(jde);
} finally {
if (session.isOpen()) {
session.close();
}
}
}