需要代码在java中创建连接池吗?我们如何确保连接池不返回已在使用的同一对象?如果客户端从连接池中取出连接后关闭连接会怎么样?
我想用简单的Java术语创建它,并希望看到它在多线程环境中如何工作.我的意思是哪些方法将同步,哪些方法不同步.这门课还会成为公共课吗?如果是,则任何人都可以访问此类并重新初始化连接池?
我有一些代码如下.但我不知道如何"关闭来自池的连接将其返回到池中,它不会在物理上关闭连接." 此外,我没有理解这一点"因为如果连接已从池中借用而尚未返回,则它不是"可用"且无法重新分配给池中的另一个客户端.
import java.util.*;
import java.sql.*;
class ConnectionPoolManager
{
String databaseUrl = "jdbc:mysql://localhost:3306/myDatabase";
String userName = "userName";
String password = "userPass";
Vector connectionPool = new Vector();
public ConnectionPoolManager()
{
initialize();
}
public ConnectionPoolManager(
//String databaseName,
String databaseUrl,
String userName,
String password
)
{
this.databaseUrl = databaseUrl;
this.userName = userName;
this.password = password;
initialize();
}
private void initialize()
{
//Here we can initialize all the information that we need
initializeConnectionPool();
}
private void initializeConnectionPool()
{
while(!checkIfConnectionPoolIsFull())
{ …
Run Code Online (Sandbox Code Playgroud) org.apache.commons.dbcp BasicDatasource和PoolingDataSoure有什么区别?两者都支持连接池吗?什么时候使用它们?
以下是我的帮助类获取数据库连接:
我已经使用了这里描述的C3P0连接池.
public class DBConnection {
private static DataSource dataSource;
private static final String DRIVER_NAME;
private static final String URL;
private static final String UNAME;
private static final String PWD;
static {
final ResourceBundle config = ResourceBundle
.getBundle("props.database");
DRIVER_NAME = config.getString("driverName");
URL = config.getString("url");
UNAME = config.getString("uname");
PWD = config.getString("pwd");
dataSource = setupDataSource();
}
public static Connection getOracleConnection() throws SQLException {
return dataSource.getConnection();
}
private static DataSource setupDataSource() {
ComboPooledDataSource cpds = new ComboPooledDataSource();
try {
cpds.setDriverClass(DRIVER_NAME);
} …
Run Code Online (Sandbox Code Playgroud) 我正在使用Celery独立版(不在Django中).我计划在多台物理机上运行一个工作任务类型.该任务执行以下操作
我正在使用PostgreSQL,但这同样适用于使用连接的其他商店类型.过去,我使用数据库连接池来避免在每个请求上创建新的数据库连接,或者避免将连接打开太长时间.但是,由于每个Celery工作程序都在一个单独的进程中运行,我不确定它们实际上是如何共享池的.我错过了什么吗?我知道Celery允许你坚持从芹菜工人那里得到的结果,但这不是我想在这里做的.每个任务可以根据处理的数据执行多个不同的更新或插入.
从Celery工作者访问数据库的正确方法是什么?
是否可以跨多个工作人员/任务共享一个池,还是有其他方法可以做到这一点?
我试图确定我是否实际使用JDBC连接池.经过一些研究,实施几乎看起来太容易了.事实上比常规连接更容易,所以我想验证.
这是我的连接类:
public class DatabaseConnection {
Connection conn = null;
public Connection getConnection() {
BasicDataSource bds = new BasicDataSource();
bds.setDriverClassName("com.mysql.jdbc.Driver");
bds.setUrl("jdbc:mysql://localhost:3306/data");
bds.setUsername("USERNAME");
bds.setPassword("PASSWORD");
try{
System.out.println("Attempting Database Connection");
conn = bds.getConnection();
System.out.println("Connected Successfully");
}catch(SQLException e){
System.out.println("Caught SQL Exception: " + e);
}
return conn;
}
public void closeConnection() throws SQLException {
conn.close();
}
Run Code Online (Sandbox Code Playgroud)
}
这是真正的连接汇集吗?我在另一个类中使用连接如下:
//Check data against database.
DatabaseConnection dbConn = new DatabaseConnection();
Connection conn;
ResultSet rs;
PreparedStatement prepStmt;
//Query database and check username/pass against table.
try{
conn = dbConn.getConnection(); …
Run Code Online (Sandbox Code Playgroud) 我正在Eclipse Juno中开发Java EE Web应用程序.我已将Tomcat配置为使用JDBC连接池(org.apache.tomcat.jdbc.pool)以及PostgreSQL数据库.以下是我的项目的META-INF/context.xml中的配置:
<?xml version="1.0" encoding="UTF-8"?>
<Context>
<!-- Configuration for the Tomcat JDBC Connection Pool -->
<Resource name="jdbc/someDB"
type="javax.sql.DataSource"
auth="Container"
factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
driverClassName="org.postgresql.Driver"
url="jdbc:postgresql://localhost:5432/somedb"
username="postgres"
password="12345"
maxActive="100"
minIdle="10"
initialSize="10"
validationQuery="SELECT 1"
validationInterval="30000"
removeAbandoned="true"
removeAbandonedTimeout="60"
abandonWhenPercentageFull="50" />
</Context>
Run Code Online (Sandbox Code Playgroud)
我的应用程序使用Eclipse部署到Tomcat,在Tomcat的context.xml中,属性reloadable设置为"true",以便在检测到更改时自动重新加载Web应用程序:
<Context reloadable="true">
我注意到,每次上面提到的自动重新加载时,都会保留10个与PostgreSQL db的连接(因为在webapp的context.xml中,initialSize ="10").因此,在10次更改后抛出PSQLException:
org.postgresql.util.PSQLException: FATAL: sorry, too many clients already
...
Run Code Online (Sandbox Code Playgroud)
如果我手动重启Tomcat - 一切都很好,只保留10个连接.
有没有人知道解决这个问题的方法,所以有可能将reloadable设置为"true"并且不会在每次重新加载上下文时导致更多连接汇集?
非常感谢任何帮助.
PS Apache Tomcat版本7.0.32
我在Tomcat中使用C3P0作为连接池,我看到非常令人担忧的错误:
2010-09-16 13:25:00,160 [Timer-0] WARN com.mchange.v2.async.ThreadPoolAsynchronousRunner - com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@43502400 -- APPARENT DEADLOCK!!! Creating emergency threads for unassigned pending tasks!
2010-09-16 13:25:01,407 [Timer-0] WARN com.mchange.v2.async.ThreadPoolAsynchronousRunner - com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@43502400 -- APPARENT DEADLOCK!!! Complete Status:
Managed Threads: 10
Active Threads: 0
Active Tasks:
Pending Tasks:
com.mchange.v2.resourcepool.BasicResourcePool$1RefurbishCheckinResourceTask@6e4151a7
Pool thread stack traces:
Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#6,5,main]
java.lang.Object.wait(Native Method)
com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:534)
Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#2,5,main]
java.lang.Object.wait(Native Method)
com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:534)
Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#1,5,main]
java.lang.Object.wait(Native Method)
com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:534)
Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#0,5,main]
java.lang.Object.wait(Native Method)
com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:534)
Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#5,5,main]
java.lang.Object.wait(Native Method)
com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:534)
Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#4,5,main]
java.lang.Object.wait(Native Method)
... many more, exact same stack trace
Run Code Online (Sandbox Code Playgroud)
第534行是:
while (true) {
Runnable …
Run Code Online (Sandbox Code Playgroud) 大家好我正在使用Hibernate + Struts2 + Tomcat6 + Mysql作为我的J2EE框架.我一直在使用hibernate的内置连接池机制,但结果证明mysql在8小时后关闭它的连接是有问题的.无论如何,我google了一下,发现我应该通过JNDI数据源获得我的连接,但我无法就此达成一个完整的教程.我应该采取什么措施呢?请给我足够的细节,我对此有点新意.这是我的hibernate.cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">
jdbc:mysql://localhost/hposg?characterEncoding=UTF-8
</property>
<property name="connection.username">root</property>
<property name="connection.password"></property>
<property name="show_sql">true</property>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="current_session_context_class">thread</property>
<property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
<property name="hbm2ddl.auto">update</property>
<property name="hibernate.max_fetch_depth">3</property>
<property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
<property name="hibernate.c3p0.acquire_increment">2</property>
<property name="hibernate.c3p0.idle_test_period">300</property>
<property name="hibernate.c3p0.timeout">1800</property>
<property name="hibernate.c3p0.max_size">25</property>
<property name="hibernate.c3p0.min_size" >3</property>
<property name="hibernate.c3p0.max_statement">0</property>
<property name="hibernate.c3p0.preferredTestQuery">select 1;</property>
<property name="hibernate.c3p0.testConnectionOnCheckout">true</property>
<property name="hibernate.c3p0.validate">true</property>
<!-- Mapping files -->
<mapping resource="com/hposg/hibernate/resources/Player.hbm.xml"/>
<mapping resource="com/hposg/hibernate/resources/Game.hbm.xml"/>
...
</session-factory>
</hibernate-configuration>
Run Code Online (Sandbox Code Playgroud)
我也尝试了这个,但它没有成功:在WebContent/META-INF中创建一个context.xml,包含:
<Context path="" docBase="../RSGames" debug="0" …
Run Code Online (Sandbox Code Playgroud) 我已经在可怕的"错误19"上尝试了所有其他帖子,并发现少数答案不适用或没有帮助,因此这篇新帖子.对于所有Azure + EF用户来说,这是一个非常严重的潜在问题.
我正在使用VS2013 EF6.1 Razor项目中的所有内容的最新版本(最后列出的软件包).该数据库托管在SQL Azure上.
运行我的webapp几次后(在开发环境中)我收到此错误: A transport-level error has occurred when receiving results from the server. (provider: Session Provider, error: 19 - Physical connection is not usable)
它死的线总是如此:
我收集错误与连接池(和连接用完)有关,但我无法在任何地方发现泄漏.
当我访问整个应用程序中的OWIN成员资格和其他数据库功能时,我有一个DatabaseContoller
所有其他控制器继承的.这将创建所有相关组件并处理它们.
[Authorize]
public class DatabaseController : Controller
{
#region properties
/// <summary>
/// User manager - attached to application DB context
/// </summary>
protected UserManager<ApplicationUser> UserManager { get; set; }
/// <summary>
/// Role manager - attached to application DB context
/// </summary>
protected …
Run Code Online (Sandbox Code Playgroud) 所以我已经弄清楚了我的错误,现在我只是在寻找一些关于究竟发生了什么的见解.我正在使用Apache Tomcat版本7.0.32.我正在使用本教程为JDBC设置池.在我的META-INF文件夹中,我创建了一个context.xml文件并将其放在那里.
<?xml version="1.0" encoding="UTF-8"?>
<Context>
<Resource type="javax.sql.DataSource" name="jdbc/gmustudent"
factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/official"
username="root" password="root"
maxActive="100" maxIdle="20" minIdle="15" initialSize="15" maxWait="10000" />
</Context>
Run Code Online (Sandbox Code Playgroud)
我写这篇文章时遇到了这个错误
WARNING: Unexpected exception resolving reference
java.sql.SQLException: com.mysql.jdbc.Driver
at org.apache.tomcat.jdbc.pool.PooledConnection.connectUsingDriver(PooledConnection.java:254)
at org.apache.tomcat.jdbc.pool.PooledConnection.connect(PooledConnection.java:182)
at org.apache.tomcat.jdbc.pool.ConnectionPool.createConnection(ConnectionPool.java:699)
at org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:631)
at org.apache.tomcat.jdbc.pool.ConnectionPool.init(ConnectionPool.java:485)
at org.apache.tomcat.jdbc.pool.ConnectionPool.<init>(ConnectionPool.java:143)
at org.apache.tomcat.jdbc.pool.DataSourceProxy.pCreatePool(DataSourceProxy.java:116)
at org.apache.tomcat.jdbc.pool.DataSourceProxy.createPool(DataSourceProxy.java:103)
at org.apache.tomcat.jdbc.pool.DataSourceFactory.createDataSource(DataSourceFactory.java:539)
at org.apache.tomcat.jdbc.pool.DataSourceFactory.getObjectInstance(DataSourceFactory.java:237)
at org.apache.naming.factory.ResourceFactory.getObjectInstance(ResourceFactory.java:143)
at javax.naming.spi.NamingManager.getObjectInstance(NamingManager.java:304)
at org.apache.naming.NamingContext.lookup(NamingContext.java:843)
at org.apache.naming.NamingContext.lookup(NamingContext.java:154)
at org.apache.naming.NamingContext.lookup(NamingContext.java:831)
at org.apache.naming.NamingContext.lookup(NamingContext.java:168)
at org.apache.catalina.core.NamingContextListener.addResource(NamingContextListener.java:1061)
at org.apache.catalina.core.NamingContextListener.createNamingContext(NamingContextListener.java:671)
at org.apache.catalina.core.NamingContextListener.lifecycleEvent(NamingContextListener.java:270)
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5173)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559)
at …
Run Code Online (Sandbox Code Playgroud)