Java中不使用jconnect4连接Sybase数据库的问题求助
问题描述
原本通过jconnect4库结合bcpkix-jdk15on实现了Sybase数据库连接,核心代码如下:
import com.sybase.jdbc4.jdbc.SybDataSource; import java.sql.Connection; import java.sql.SQLException; public class SybaseConnectionManager { public static Connection getSybaseConnection(String serverName, String databaseName, String userName, String password, String url) throws DataGeneratorException { SybDataSource ds = new SybDataSource(); try { ds.setServerName(serverName); ds.setDatabaseName(databaseName); ds.setUser(userName); ds.setPassword(password); // Splitting URL by semicolon String[] params = url.split(";"); for (String param : params) { String[] props = param.split("="); switch (props[0].toUpperCase()) { case "PORT": ds.setPortNumber(Integer.parseInt(props[1])); break; case "ENCRYPT_PASSWORD": ds.setENCRYPT_PASSWORD(props[1]); break; case "RETRY_WITH_NO_ENCRYPTION": ds.setRETRY_WITH_NO_ENCRYPTION(props[1]); break; case "JCE_PROVIDER_CLASS": ds.setJCE_PROVIDER_CLASS(props[1]); break; } } // Get the connection Connection con = ds.getConnection(); con.setAutoCommit(false); return con; } catch (SQLException e) { log.error("Handling Sybase Exception", e); throw new DataGeneratorException(e.getMessage()); } } }
但在Linux服务器上,jconnect4与ojdbcx库共存时出现ClassNotFoundError(本地Windows Eclipse环境运行正常);改用jtds库连接时,触发错误:"Adaptive Server requires encryption of the login password on the network",当前jtds的JDBC URL及连接属性配置如下:
jdbc:jtds:sybase://<hostname>:<portno>/<dbname> 连接属性: user: [用户名] password: [密码] encrypt_password: [未配置] retry_with_no_encryyption: [未配置] jce_provider_class: [未配置]
求问:如何在Java中不使用jconnect4实现Sybase数据库的正常连接?
解决方案
一、修复jtds连接的密码加密问题
jtds原生支持Sybase的密码加密要求,只需调整URL或连接属性配置:
1. 调整JDBC URL参数
在URL中添加密码加密相关参数,示例:
jdbc:jtds:sybase://<hostname>:<portno>/<dbname>?encrypt=true&useSSL=false
encrypt=true:开启密码加密传输useSSL=false:仅加密密码而非全链路SSL(若服务器要求全链路加密则设为true)- 若服务器指定加密协议,可追加
sslProtocol=TLSv1.2等参数适配
2. 配置连接属性方式
如果通过连接属性对象配置,需设置:
encrypt:true- 确保使用jtds 1.3.1及以上版本,旧版本可能存在加密逻辑兼容性问题
3. 依赖检查
确认项目引入的jtds jar包为完整版本,避免使用缺失加密类的精简包。
二、替代方案:使用Microsoft JDBC Driver for SQL Server
Sybase ASE与SQL Server存在技术渊源,Microsoft JDBC Driver for SQL Server可兼容连接Sybase ASE,配置方式如下:
1. 引入依赖(Maven)
<dependency> <groupId>com.microsoft.sqlserver</groupId> <artifactId>mssql-jdbc</artifactId> <version>12.4.1.jre8</version> </dependency>
2. 连接代码示例
import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class SybaseMsSqlJdbcManager { public static Connection getConnection(String hostname, int port, String dbName, String user, String password) throws SQLException { String url = String.format("jdbc:sqlserver://%s:%d;databaseName=%s;encrypt=false;trustServerCertificate=true", hostname, port, dbName); // 若服务器要求密码加密,将encrypt设为true并调整SSL参数 Connection conn = DriverManager.getConnection(url, user, password); conn.setAutoCommit(false); return conn; } }
三、可选:解决Linux环境类冲突(保留jconnect4)
如果希望继续使用jconnect4,可尝试以下方式解决类冲突:
- 通过Maven的
exclusions排除ojdbcx与jconnect4的冲突依赖 - 调整服务器类加载顺序,优先加载其中一方的依赖类
- 检查Linux环境下的jar包完整性,排除损坏或缺失的情况
内容的提问来源于stack exchange,提问作者Seriously
相关产品推荐
相关产品推荐

