Java “源代码有时抛出”;不支持协议,正在放弃连接。”; 大家好,,

Java “源代码有时抛出”;不支持协议,正在放弃连接。”; 大家好,,,java,postgresql,connection-pooling,apache-commons-dbcp,Java,Postgresql,Connection Pooling,Apache Commons Dbcp,我的连接池有这个问题。我有这个问题已经有大约两周了,它不断出现,问题是它不是一个一致性问题。有时它工作有时它抛出异常 异常堆栈跟踪如下所示: dec. 04, 2017 8:34:29 AM org.postgresql.core.v3.ConnectionFactoryImpl openConnectionImpl SEVERE: Protocol not supported, abandoning connection. dec. 04, 2017 8:34:29 AM org.postgr

我的连接池有这个问题。我有这个问题已经有大约两周了,它不断出现,问题是它不是一个一致性问题。有时它工作有时它抛出异常

异常堆栈跟踪如下所示:

dec. 04, 2017 8:34:29 AM org.postgresql.core.v3.ConnectionFactoryImpl openConnectionImpl
SEVERE: Protocol not supported, abandoning connection.
dec. 04, 2017 8:34:29 AM org.postgresql.Driver connect
SEVERE: Connection error:
org.postgresql.util.PSQLException: A connection could not be made using the requested protocol null.
        at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:57)
        at org.postgresql.jdbc.PgConnection.<init>(PgConnection.java:194)
        at org.postgresql.Driver.makeConnection(Driver.java:450)
        at org.postgresql.Driver.connect(Driver.java:252)
        at org.apache.commons.dbcp2.DriverConnectionFactory.createConnection(DriverConnectionFactory.java:39)
        at org.apache.commons.dbcp2.PoolableConnectionFactory.makeObject(PoolableConnectionFactory.java:256)
        at org.apache.commons.pool2.impl.GenericObjectPool.create(GenericObjectPool.java:888)
        at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:432)
        at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:361)
        at org.apache.commons.dbcp2.PoolingDataSource.getConnection(PoolingDataSource.java:134)
        at org.apache.commons.dbcp2.BasicDataSource.getConnection(BasicDataSource.java:1533)
        at implementation.DataSource.getConnection(DataSource.java:54)
        at io.swagger.api.impl.ProjectApiServiceImpl.deleteProject(ProjectApiServiceImpl.java:58)
        at io.swagger.api.ProjectApi.deleteProject(ProjectApi.java:60)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        ......
        at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:635)
        at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:555)
        at java.base/java.lang.Thread.run(Thread.java:844)

可能是ds上使用的设置还是其他设置?一开始我以为是getConnection方法没有正确同步,但我开始怀疑这一点。我已经尝试过调整设置,减少驱逐次数,增加驱逐次数。但是我没有主意。

这个问题的解决方案是使用本地数据库,而不是我可以访问的公共数据库服务器。因此,如果遇到类似问题,请确保数据库服务器没有出现故障

这可能是PGSQL ConnectionFactory中的错误。根据,有一个属性映射包含一个协议名,在您的例子中是null。您的代码中没有任何明显的原因会导致这种情况。我建议您获取PG驱动程序的源代码,并在此方法中设置一个断点,以查看从何处获取
null
值。。因此不能保证缺陷存在于PGSQL中?在
ConnectionFactoryImpl
中发生了很多与网络和SSL/TLS有关的事情,如果失败,可能会导致
null
返回以允许
ConnectionFactory
回退到另一个协议版本。这就是
协议不受支持的消息的来源。如果问题是间歇性的,您可能会遇到网络问题,但解决这一问题将非常困难。您认为我应该在pgjdbc github或apache中发布该问题吗?如果apache有一个这样的系统,间歇性的特性告诉我这是一个网络问题。抛出此错误的条件非常具体。查看
ConnectionFactoryImpl.doAuthentication()
以了解所涉及的内容。也许在那里设置一个断点,以便在act中捕获它并查看接收到的内容。甚至可能是服务器中的一个bug?我们从这里看不出来。我建议在PG github上发布bug之前进行更多的故障排除。是的,我的内存不足,请想想。。。
<dependency>
  <groupId>org.apache.commons</groupId>
  <artifactId>commons-dbcp2</artifactId>
  <version>2.1.1</version>
</dependency>
<dependency>
  <groupId>org.apache.commons</groupId>
  <artifactId>commons-pool2</artifactId>
  <version>2.4.3</version>
</dependency>
<dependency>
  <groupId>org.postgresql</groupId>
  <artifactId>postgresql</artifactId>
  <version>42.1.4</version>
</dependency>
package implementation;

import java.beans.PropertyVetoException;
import java.io.IOException;
import java.sql.Connection;
import java.sql.SQLException;
import org.apache.commons.dbcp2.BasicDataSource;
/**
 *
 * @author Lagoni
 */
public class DataSource {

    private static DataSource datasource;
    private BasicDataSource ds;
    private final Object lock = new Object();

    private DataSource() throws IOException, SQLException, PropertyVetoException {
        ds = new BasicDataSource();
        ds.setDriverClassName("org.postgresql.Driver");
        ds.setUsername("username");
        ds.setPassword("password");
        ds.setUrl("jdbc:postgresql://host:" + 1234 + "/database");

        ds.setMaxWaitMillis(1000 * 60); //wait max 1 min to get new connection
        ds.setMaxTotal(5);
        ds.setMaxIdle(5);
        ds.setTestWhileIdle(true);
        ds.setTestOnReturn(true);
        ds.setTimeBetweenEvictionRunsMillis(10000); // 10 sec wait to run evictor process
        ds.setSoftMinEvictableIdleTimeMillis(10000); // 10 sec wait to run evictor process
        ds.setMinEvictableIdleTimeMillis(10000); // 10 seconds to wait before idle connection is evicted
        ds.setMaxConnLifetimeMillis(1000*60*10); // 10 minutes is max life time
    }
    public static DataSource getInstance() {
        return datasource;
    }

    public static void cacheInstance() throws IOException, SQLException, PropertyVetoException{
        datasource = new DataSource();
    }

    /**
     * Weird exception is sometimes thrown.
     * @return
     * @throws SQLException 
     */
    public Connection getConnection() throws SQLException {
        synchronized(lock){
            return ds.getConnection();
        }
    }
}