我通过Postgres JDBC驱动程序使用Java 1.7和Postgres。将从Web服务使用数据库连接。在测试中,我收到以下错误:
FATAL: connection limit exceeded for non-superusers
我通过使我的连接静态解决了错误,并且只创建了一次。我的问题是,静态连接安全吗?这是正确的方法吗?
我通过看起来像这样的ConnectionFactory使用连接:
public class ConnectionFactory
{
String driverClassName = "org.postgresql.Driver";
String connectionUrl = "jdbc:postgresql://localhost:5432/dbName";
String dbUser = "user";
String dbPwd = "password";
private static ConnectionFactory connectionFactory = null;
private static Connection conn = null;
private ConnectionFactory()
{
try
{
Class.forName(driverClassName);
}
catch (ClassNotFoundException e)
{
e.printStackTrace();
}
}
public Connection getConnection() throws SQLException
{
if (conn == null)
{
conn = DriverManager.getConnection(connectionUrl, dbUser, dbPwd);
}
return conn;
}
public static ConnectionFactory getInstance()
{
if (connectionFactory == null)
{
connectionFactory = new ConnectionFactory();
}
return connectionFactory;
}
}
答案 0 :(得分:1)
抱歉,原帖没有仔细查看您的代码。哇。我还是看不懂。无论如何,第三次的魅力。如果您的代码是单线程的 - 那么您的罚款。如果它是多线程的,请使用Commons连接池之类的东西来管理您的连接。看起来驱动程序是线程安全的,但不应将连接视为线程安全。因此,一旦加载了驱动程序,您就可以安全地从多个线程调用驱动程序上的getConnection,但不应跨线程共享连接。
答案 1 :(得分:1)
Postgres JDBC驱动程序为documented as thread safe,如果需要,多个线程可以使用该连接。如果某个线程在另一个线程正在使用该连接时尝试使用该连接,它将等待另一个线程完成其当前操作。
出于性能原因,无论如何都可以使用连接池。