Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 捕获无效的休眠连接URL错误_Java_Mysql_Hibernate_Url_Connection - Fatal编程技术网

Java 捕获无效的休眠连接URL错误

Java 捕获无效的休眠连接URL错误,java,mysql,hibernate,url,connection,Java,Mysql,Hibernate,Url,Connection,如果我在hibernate.cfg.xml文件中放置了错误的连接URL,我希望能够检测到它并优雅地终止,但我不知道如何终止;它只是在hibernate初始化过程中无限期地挂在buildSessionFactory()上: SessionFactory sf = new AnnotationConfiguration().configure().buildSessionFactory(); 它在一个try块中,我试图捕获一个通用异常,但buildSessionFactory()从不抛出异常,它只

如果我在hibernate.cfg.xml文件中放置了错误的连接URL,我希望能够检测到它并优雅地终止,但我不知道如何终止;它只是在hibernate初始化过程中无限期地挂在buildSessionFactory()上:

SessionFactory sf = new AnnotationConfiguration().configure().buildSessionFactory();
它在一个try块中,我试图捕获一个通用异常,但buildSessionFactory()从不抛出异常,它只是挂起。这是my hibernate.cfg.xml中的URL元素:

<property name="hibernate.connection.url">jdbc:mysql://123.123.123.123/mydb</property>
jdbc:mysql://123.123.123.123/mydb
我的系统:带有Tomcat5.5、Java1.6、Hibernate3和MySQL5的Ubuntu9.10

当我第一次初始化hibernate时,它只是挂起22秒,然后开始发出关于线程和死锁的警告(从下面开始):

15:16:25758警告ThreadPoolAsynchronousRunner.class:com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@a010ba--明显的僵局!!!为未分配的挂起任务创建紧急线程!
15:16:25761警告ThreadPoolAsynchronousRunner.class:com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@a010ba--明显的僵局!!!完成状态:
托管线程:3个
活动线程:3个
活动任务:
com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@109da93(com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#0)
com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@1ed1dbe(com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#2)
com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@3bc1a1(com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#1)
未决任务:
com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@12549c4
com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@10df4e2
池线程堆栈跟踪:
线程[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#0,5,main]
java.net.PlainSocketImpl.socketConnect(本机方法)
java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333)
java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195)
connect(PlainSocketImpl.java:182)
net.socksocketimpl.connect(socksocketimpl.java:366)
java.net.Socket.connect(Socket.java:525)
java.net.Socket.connect(Socket.java:475)
Socket.(Socket.java:372)
Socket.(Socket.java:215)
com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:253)
MysqlIO.com.mysql.jdbc.MysqlIO.(MysqlIO.java:284)
com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2194)
com.mysql.jdbc.ConnectionImpl.(ConnectionImpl.java:723)
JDBC4Connection(JDBC4Connection.java:46)
sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法)
sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
java.lang.reflect.Constructor.newInstance(Constructor.java:513)
com.mysql.jdbc.Util.HandleneInstance(Util.java:406)
com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:302)
com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:282)
com.mchange.v2.c3p0.DriverManagerDataSource.getConnection(DriverManagerDataSource.java:135)
com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:182)
com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:171)
com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.AcquisiteSource(C3P0PooledConnectionPool.java:137)
com.mchange.v2.resourcepool.BasicResourcePool.doAcquire(BasicResourcePool.java:1014)
com.mchange.v2.resourcepool.BasicResourcePool.access$800(BasicResourcePool.java:32)
com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask.run(BasicResourcePool.java:1810)
com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:547)
编辑:这是我的hibernate.cfg.xml中的c3p0属性

<property name="hibernate.c3p0.acquire_increment">1</property>
<property name="hibernate.c3p0.idle_test_period">100</property>
<property name="hibernate.c3p0.max_size">100</property>
<property name="hibernate.c3p0.max_statements">100</property>
<property name="hibernate.c3p0.min_size">5</property>
<property name="hibernate.c3p0.timeout">100</property>
1
100
100
100
5.
100

正如Bryan在评论中提到的,
buildSessionFactory()
没有真正挂起,时间很可能花在c3p0上,它正在尝试重新连接。引用c3p0:

当c3p0数据源尝试获取连接但失败时,它将重试多达
AcquisiteRetryAttents
次,每次尝试之间的延迟为
AcquisiteRetryDisplay
。如果所有尝试都失败,等待数据源连接的任何客户端都将看到异常,表明无法获取连接。请注意,在一轮尝试失败之前,客户端不会看到任何异常,这可能是在初始连接尝试之后的一段时间。如果
getConnection()
设置为0,c3p0将尝试无限期地获取新连接,对
getConnection()
的调用可能会无限期地阻止等待成功获取

如果未对其进行配置,则的默认值为30,因此返回
buildSessionFactory()
可能确实需要一些时间。但是,除非您使用了小于或等于零的值,否则c3p0将继续尝试无限期地获取连接,否则它会


也许你可以用一个更低的值。或者,您可以使用正确的URL,停止在异常情况(配置错误)上花费时间。

您看到的延迟最有可能是由c3p0的AcquisiteTryDelay和AcquisiteTryAttributes属性造成的,这些属性将在暂停一小段时间后重试连接(默认值为1秒)。总的来说,花很多精力让你的应用程序处理简单的配置错误似乎很愚蠢(除非你的设置有什么我不明白的地方)。谢谢你的回复。请看我对帕斯卡回答的评论。谢谢你提供的信息。我试了一套
<property name="hibernate.c3p0.acquire_increment">1</property>
<property name="hibernate.c3p0.idle_test_period">100</property>
<property name="hibernate.c3p0.max_size">100</property>
<property name="hibernate.c3p0.max_statements">100</property>
<property name="hibernate.c3p0.min_size">5</property>
<property name="hibernate.c3p0.timeout">100</property>