我正在尝试使用Java JDBC连接到Cassandra数据库。我有一个ConnectionManager类,其构造函数接受连接所需的所有参数。
该应用程序使用JDK 7,现在正计划将项目升级到JDK 11。
我们配置了24个Cassandra数据库IP,并将重试值设置为10。
我们已经将IP加载到一个arraylist中,并对其进行循环,然后使用Java Random utils根据arrayllist大小选择IP。下面的executeQuery方法将循环,直到为给定IP建立连接,并将重试10次。
private Connection getConnection() throws SQLException
{
if (con != null && !con.isClosed()){
LOG.debug("","Returning existing connection...");
return con;
}
ArrayList<String> hostsCopy = new ArrayList<String>();
hostsCopy.addAll(hosts);
while (!hostsCopy.isEmpty())
{
String hostToTry = hostsCopy.get(random.nextInt(hostsCopy.size()));
try
{
LOG.debug("","Before connecting : "+CommonUtils.formatDate(Calendar.getInstance().getTime(),"dd-MM-yyyy HH:mm:ss" ));
con = DriverManager.getConnection("jdbc:cassandra://" + hostToTry + ":" + thriftPort + "/" + keyspace);
LOG.debug("","After connecting : "+CommonUtils.formatDate(Calendar.getInstance().getTime(),"dd-MM-yyyy HH:mm:ss" ));
return con;
} catch (SQLException e)
{
LOG.error("", "Unable to connect to " + hostToTry);
hostsCopy.remove(hostToTry);
}
try {
Thread.currentThread().sleep(cassandraConnectionSleepforDifferentHost);
} catch (InterruptedException e) {
LOG.error("", "Thread interrupted ");
e.printStackTrace();
}
}
LOG.error("", "No remaining servers to connect to");
throw new RuntimeException(CommonServicesErrorConstants.CASSANDRA_DA_002);
}
查看执行查询方法:
public Pair<ResultSet, Statement> executeQuery(String query) throws SQLException
{
int retryCount = 0;
while (retryCount < retries)
{
try
{
Connection con = getConnection();
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery(query);
return new Pair<ResultSet, Statement>(rs, stmt);
} catch (SQLTransientConnectionException e0)
{
LOG.error("","Transient error executing query, retrying. Retry count " + retryCount);
e0.printStackTrace();
} catch (SQLNonTransientConnectionException e1)
{
// this means the consistency level cannot be satisfied.
if (e1.getCause() instanceof UnavailableException)
{
LOG.error("","Unavailable exception executing query, giving up");
throw e1;
} else
{
LOG.error("","Exception executing query");
e1.printStackTrace();
LOG.error("","Retrying a different host");
// we can swallow this, we're getting a new connection anyway
try
{
close();
} catch (SQLException e)
{
e.printStackTrace();
}
}
} catch (SQLSyntaxErrorException e2)
{
if (UnconfiguredColumnFamilyException.isUnconfiguredColumnFamilyException(e2))
throw new UnconfiguredColumnFamilyException(e2);
else
throw e2;
}
retryCount++;
try {
Thread.currentThread().sleep(cassandraConnectionSleepforRetry);
} catch (InterruptedException e) {
LOG.error("", "Thread interrupted ");
e.printStackTrace();
}
}
// Close the connection when all the retries are done
try
{
close();
} catch (SQLException e)
{
e.printStackTrace();
}
throw new RuntimeException(CommonServicesErrorConstants.CASSANDRA_DA_004);
}
问题:如何升级这段代码
我们可以使用HikariCp连接池概念吗?
提前谢谢!!
1条答案
按热度按时间eeq64g8w1#
DataStax提供了JDBC and ODBC drivers,用于将遗留应用程序连接到Apache Cassandra、DataStax Enterprise和Astra DB。
然而,使用the Cassandra Java driver更有意义,因为您将对代码进行重大重构,以便从Java7升级。
重构代码以适应较新版本的Java,但继续使用JDBC(在我看来)是一个错误的决定,因为与Java驱动程序中可用的CQL API相比,您可以访问的Cassandra功能有限。干杯