Java HSDC数据库连接
我必须通过Java程序将数据注入数据库。 我使用Hibernate和Thread(通过Executor的线程池),因为客户需要一个快速的软件。 我用一堆线。 该程序在45秒-1分钟内运行良好,在我出现此错误后,反复执行:Java HSDC数据库连接,java,multithreading,hibernate,Java,Multithreading,Hibernate,我必须通过Java程序将数据注入数据库。 我使用Hibernate和Thread(通过Executor的线程池),因为客户需要一个快速的软件。 我用一堆线。 该程序在45秒-1分钟内运行良好,在我出现此错误后,反复执行: Exception in thread "pool-1-thread-593" org.hibernate.exception.JDBCConnectionException: Cannot open connection at org.hibernate.except
Exception in thread "pool-1-thread-593" org.hibernate.exception.JDBCConnectionException: Cannot open connection
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:99)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:52)
at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:449)
at org.hibernate.jdbc.ConnectionManager.getConnection(ConnectionManager.java:167)
at org.hibernate.jdbc.JDBCContext.connection(JDBCContext.java:142)
at org.hibernate.transaction.JDBCTransaction.begin(JDBCTransaction.java:85)
at org.hibernate.impl.SessionImpl.beginTransaction(SessionImpl.java:1463)
at fr.msa.agora.bp0gos.qualification.structure.InjecteurFluxStructureRFOSImpl$UnitOfWork.run(InjecteurFluxStructureRFOSImpl.java:107)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)
Caused by: java.sql.SQLException: socket creation error
at org.hsqldb.jdbc.Util.sqlException(Unknown Source)
at org.hsqldb.jdbc.jdbcConnection.<init>(Unknown Source)
at org.hsqldb.jdbcDriver.getConnection(Unknown Source)
at org.hsqldb.jdbcDriver.connect(Unknown Source)
at org.apache.commons.dbcp.DriverConnectionFactory.createConnection(DriverConnectionFactory.java:38)
at org.apache.commons.dbcp.PoolableConnectionFactory.makeObject(PoolableConnectionFactory.java:294)
at org.apache.commons.pool.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:840)
at org.apache.commons.dbcp.PoolingDataSource.getConnection(PoolingDataSource.java:96)
at org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:880)
at org.springframework.orm.hibernate3.LocalDataSourceConnectionProvider.getConnection(LocalDataSourceConnectionProvider.java:81)
at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:446)
提前谢谢大家,,
托马斯我相信你的问题就在这里:
- hibernate.c3p0.max_size=20
显然,如果你有97331个同步连接,你将触发上面提到的异常,我想,这正是正在发生的事情。我建议您限制
线程池
一次只能同时运行20个线程。但这取决于您的用例。例如,如果您运行的应用程序刚刚启动,执行此任务,然后关闭,那么我建议的方法将很好地工作。但是,如果您的应用程序是一个长时间运行的应用程序(可能是一个webapp),并且需要其他用户进行其他数据库连接,那么我建议将ThreadPool max设置得更低(可能是10),并确保不会以其他方式违反c3p0限制(一次连接的用户太多,或运行的作业太多)。提高c3p0限制也会有所帮助。我感觉没有必要超过100,但我记不清确切的原因,抱歉。Comme indiquédans un autre post,j'ai rajoutédans mon Fichier de configuration Hibernate ceci:Hibernate.c3p0.min_size=5 Hibernate.c3p0.max_size=20 Hibernate.c3p0.timeout=1800 Hibernate.c3p0.max_statements=50正如论坛()中提到的,我在Hibernate配置文件中添加了以下说明:Hibernate.c3p0.max_size=20 Hibernate.c3p0.timeout=1800 Hibernate.c3p0.max_statements=50,但它会导致同样的问题。很抱歉,我变得“疯狂”,我用我的母语而不是英语写作。对不起,祝大家有个愉快的一天,托马斯听起来你已经用完了所有的连接,你正在创建(和运行)多少个UnitOfWork
对象?如果超过20,我想你会遇到问题。Jamey,谢谢你的回答。事实上,有97331个XML文件,然后MapUnficher方法被调用97331次,最后persisterTable方法被调用97331次。因此,创建了97331个UnitOfWork。我认为它很好。你认为它太好了吗很多?我能纠正我的代码吗?谢谢你,杰米,托马斯杰米,我非常感谢你的解决方案。我会尝试实现你提出的解决方案。不用担心,请记住接受这个答案,如果它对你有效的话。;)杰米,我在我的代码中添加了这条指令:“poolDeThread=Executors.newFixedThreadPool(20);”。我创建了一个池,将运行的最大线程数设置为20。但是我想我也必须改变我的代码。因为如果我不更改代码,我将执行97331任务。非常感谢,Thomas就像你说的,我限制了并发线程的数量:我怎样才能表明你已经解决了这个问题?祝您愉快。您好,“若要将答案标记为已接受,请单击答案旁边的复选标记,将其从灰色切换为已填写。”,请查看此链接以获取完整信息:。:)
@Service("InjecteurStructure")
public class InjecteurFluxStructureRFOSImpl extends AbstractInjecteurFluxRFOS implements InjecteurFluxRFOS {
private final StructureRFOS2StructureGOSMapperImpl mapper;
@Autowired
public InjecteurFluxStructureRFOSImpl(final StructureRFOS2StructureGOSMapperImpl pMapper,
final SessionFactory pSession, final Executor pPoolDeThread, final GestionRepertoire pGestionRepertoire) {
super(pSession, pPoolDeThread, pGestionRepertoire);
mapper = pMapper;
}
@Override
public void mapUnFichier(final File pFichier) {
final RFOSStructure structureFichier = JAXB.unmarshal(pFichier, RFOSStructure.class);
persisterTable(structureFichier.getSTS());
}
private void persisterTable(final STS pStructureSTS) {
final UnitOfWork unit = new UnitOfWork(mapper, sessionFactory, pStructureSTS);
poolDeThread.execute(unit);
}
private static class UnitOfWork implements Runnable {
private final StructureRFOS2StructureGOSMapperImpl mapper;
private final SessionFactory sessionFactory;
private final STS structureSTS;
public UnitOfWork(final StructureRFOS2StructureGOSMapperImpl pMapper, final SessionFactory pSession,
final STS pStructureSTS) {
mapper = pMapper;
sessionFactory = pSession;
structureSTS = pStructureSTS;
}
/*
* (non-Javadoc)
*
* @see java.lang.Runnable#run()
*/
@Override
public void run() {
final Session session = sessionFactory.openSession();
try {
final fr.msa.agora.bp0gos.metier.sts.domaine.STS structureGOS = mapper.map(structureSTS);
final Transaction transaction = session.beginTransaction();
try {
session.save(structureGOS);
session.flush();
transaction.commit();
} catch (final RuntimeException r) {
transaction.rollback();
throw r;
} catch (final Error error) {
transaction.rollback();
throw error;
}
} finally {
session.close();
}
}
}
}