无法使用 Hibernate 连接到 MS SQL Server 2008 数据库实例
Can't connect to the MS SQL Server 2008 database instance using Hibernate
我正在尝试使用 Hibernate 连接到 MSSQL 服务器。我写的代码没问题,当我尝试连接到 "normal" 数据库时,但对于一个具有实例的数据库,我总是遇到异常。
错误是:
2020-03-06 15:07:01.755 WARN com.mchange.v2.async.ThreadPoolAsynchronousRunner: com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@12fa2433 -- APPARENT DEADLOCK!!! Creating emergency threads for unassigned pending tasks!
2020-03-06 15:07:01.758 WARN com.mchange.v2.async.ThreadPoolAsynchronousRunner: com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@12fa2433 -- APPARENT DEADLOCK!!! Complete Status:
Managed Threads: 3
Active Threads: 3
Active Tasks:
com.mchange.v2.resourcepool.BasicResourcePool$ScatteredAcquireTask@5d00c227
on thread: C3P0PooledConnectionPoolManager[identityToken->2sk2t6a81cvnu23110fpe1|11389053]-HelperThread-#0
com.mchange.v2.resourcepool.BasicResourcePool$ScatteredAcquireTask@1e98ae08
on thread: C3P0PooledConnectionPoolManager[identityToken->2sk2t6a81cvnu23110fpe1|11389053]-HelperThread-#2
com.mchange.v2.resourcepool.BasicResourcePool$ScatteredAcquireTask@6c17f8ef
on thread: C3P0PooledConnectionPoolManager[identityToken->2sk2t6a81cvnu23110fpe1|11389053]-HelperThread-#1
Pending Tasks:
com.mchange.v2.resourcepool.BasicResourcePool$ScatteredAcquireTask@6665ca79
com.mchange.v2.resourcepool.BasicResourcePool$ScatteredAcquireTask@3d2f3d68
Pool thread stack traces:
Thread[C3P0PooledConnectionPoolManager[identityToken->2sk2t6a81cvnu23110fpe1|11389053]-HelperThread-#0,5,main]
java.lang.Thread.sleep(Native Method)
com.microsoft.sqlserver.jdbc.SQLServerConnection.login(SQLServerConnection.java:2336)
com.microsoft.sqlserver.jdbc.SQLServerConnection.connectInternal(SQLServerConnection.java:2067)
com.microsoft.sqlserver.jdbc.SQLServerConnection.connect(SQLServerConnection.java:1204)
com.microsoft.sqlserver.jdbc.SQLServerDriver.connect(SQLServerDriver.java:825)
com.mchange.v2.c3p0.DriverManagerDataSource.getConnection(DriverManagerDataSource.java:175)
com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:220)
com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:206)
com.mchange.v2.c3p0.impl.C3P0PooledConnectionPoolPooledConnectionResourcePoolManager.acquireResource(C3P0PooledConnectionPool.java:203)
com.mchange.v2.resourcepool.BasicResourcePool.doAcquire(BasicResourcePool.java:1138)
com.mchange.v2.resourcepool.BasicResourcePool.doAcquireAndDecrementPendingAcquiresWithinLockOnSuccess(BasicResourcePool.java:1125)
com.mchange.v2.resourcepool.BasicResourcePool.access0(BasicResourcePool.java:44)
com.mchange.v2.resourcepool.BasicResourcePool$ScatteredAcquireTask.run(BasicResourcePool.java:1870)
com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:696)
使用相同的登录密码我可以连接到数据库但不能以编程方式连接,即使用sqlcmd。
我如何创建连接:
public synchronized static SessionFactory getSessionFactory(Logger log, DbServer dbServer, String dbName) {
String url = String.format("jdbc:sqlserver://%s:%d;databaseName=%s", dbServer.getServerName(), dbServer.getPort(), dbName);
return new Configuration().configure()
.setProperty("hibernate.connection.driver_class", "com.microsoft.sqlserver.jdbc.SQLServerDriver")
.setProperty("hibernate.default_schema", "dbo")
.setProperty("hibernate.dialect", "org.hibernate.dialect.SQLServerDialect")
.setProperty("hibernate.connection.username", dbServer.getLogin())
.setProperty("hibernate.connection.password", dbServer.getPassword())
.setProperty("hibernate.connection.url", url)
.buildSessionFactory();
}
dbServer.getServerName()
returns"serverName\dbInstance",端口为1433,dbName
为master
。
使用 Microsoft SQL Management Studio 我可以使用相同的 login/password 进行连接,所以我很确定这是配置问题 - 我使用的是系统管理员 (sa),所以这不是权限问题。
解决方案是在我尝试连接到数据库时不使用端口。所以连接字符串看起来像这样:
String url = String.format("jdbc:sqlserver://%s;instanceName=%s;databaseName=%s", dbServer.getServerName(), dbServer.getInstanceName(), dbName);
我正在尝试使用 Hibernate 连接到 MSSQL 服务器。我写的代码没问题,当我尝试连接到 "normal" 数据库时,但对于一个具有实例的数据库,我总是遇到异常。
错误是:
2020-03-06 15:07:01.755 WARN com.mchange.v2.async.ThreadPoolAsynchronousRunner: com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@12fa2433 -- APPARENT DEADLOCK!!! Creating emergency threads for unassigned pending tasks!
2020-03-06 15:07:01.758 WARN com.mchange.v2.async.ThreadPoolAsynchronousRunner: com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@12fa2433 -- APPARENT DEADLOCK!!! Complete Status:
Managed Threads: 3
Active Threads: 3
Active Tasks:
com.mchange.v2.resourcepool.BasicResourcePool$ScatteredAcquireTask@5d00c227
on thread: C3P0PooledConnectionPoolManager[identityToken->2sk2t6a81cvnu23110fpe1|11389053]-HelperThread-#0
com.mchange.v2.resourcepool.BasicResourcePool$ScatteredAcquireTask@1e98ae08
on thread: C3P0PooledConnectionPoolManager[identityToken->2sk2t6a81cvnu23110fpe1|11389053]-HelperThread-#2
com.mchange.v2.resourcepool.BasicResourcePool$ScatteredAcquireTask@6c17f8ef
on thread: C3P0PooledConnectionPoolManager[identityToken->2sk2t6a81cvnu23110fpe1|11389053]-HelperThread-#1
Pending Tasks:
com.mchange.v2.resourcepool.BasicResourcePool$ScatteredAcquireTask@6665ca79
com.mchange.v2.resourcepool.BasicResourcePool$ScatteredAcquireTask@3d2f3d68
Pool thread stack traces:
Thread[C3P0PooledConnectionPoolManager[identityToken->2sk2t6a81cvnu23110fpe1|11389053]-HelperThread-#0,5,main]
java.lang.Thread.sleep(Native Method)
com.microsoft.sqlserver.jdbc.SQLServerConnection.login(SQLServerConnection.java:2336)
com.microsoft.sqlserver.jdbc.SQLServerConnection.connectInternal(SQLServerConnection.java:2067)
com.microsoft.sqlserver.jdbc.SQLServerConnection.connect(SQLServerConnection.java:1204)
com.microsoft.sqlserver.jdbc.SQLServerDriver.connect(SQLServerDriver.java:825)
com.mchange.v2.c3p0.DriverManagerDataSource.getConnection(DriverManagerDataSource.java:175)
com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:220)
com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:206)
com.mchange.v2.c3p0.impl.C3P0PooledConnectionPoolPooledConnectionResourcePoolManager.acquireResource(C3P0PooledConnectionPool.java:203)
com.mchange.v2.resourcepool.BasicResourcePool.doAcquire(BasicResourcePool.java:1138)
com.mchange.v2.resourcepool.BasicResourcePool.doAcquireAndDecrementPendingAcquiresWithinLockOnSuccess(BasicResourcePool.java:1125)
com.mchange.v2.resourcepool.BasicResourcePool.access0(BasicResourcePool.java:44)
com.mchange.v2.resourcepool.BasicResourcePool$ScatteredAcquireTask.run(BasicResourcePool.java:1870)
com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:696)
使用相同的登录密码我可以连接到数据库但不能以编程方式连接,即使用sqlcmd。
我如何创建连接:
public synchronized static SessionFactory getSessionFactory(Logger log, DbServer dbServer, String dbName) {
String url = String.format("jdbc:sqlserver://%s:%d;databaseName=%s", dbServer.getServerName(), dbServer.getPort(), dbName);
return new Configuration().configure()
.setProperty("hibernate.connection.driver_class", "com.microsoft.sqlserver.jdbc.SQLServerDriver")
.setProperty("hibernate.default_schema", "dbo")
.setProperty("hibernate.dialect", "org.hibernate.dialect.SQLServerDialect")
.setProperty("hibernate.connection.username", dbServer.getLogin())
.setProperty("hibernate.connection.password", dbServer.getPassword())
.setProperty("hibernate.connection.url", url)
.buildSessionFactory();
}
dbServer.getServerName()
returns"serverName\dbInstance",端口为1433,dbName
为master
。
使用 Microsoft SQL Management Studio 我可以使用相同的 login/password 进行连接,所以我很确定这是配置问题 - 我使用的是系统管理员 (sa),所以这不是权限问题。
解决方案是在我尝试连接到数据库时不使用端口。所以连接字符串看起来像这样:
String url = String.format("jdbc:sqlserver://%s;instanceName=%s;databaseName=%s", dbServer.getServerName(), dbServer.getInstanceName(), dbName);