- 首先说个连接数据库连接的坑,错误提示(也可能是英文)为:
驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。错误:“SQL Server 未返回响应。连接已关闭
- 在排除了网络等其他因素影响之后,初步确定是数据库太老的问题,我连接的sqlserver数据库,使用datagrip连接的时候,使用microsaft SQL server的驱动也会报相同的错,但是使用microsaft SQL server(jTds)能连接地上,然而在springboot使用jtds还是连不上,这是搞事情啊!
- 说下解决方案,在JAVA_HOME/jre/lib/security文件夹找到java的安全策略文件Java.security,其中有一段
jdk.tls.disabledAlgorithms=MD5, SSLv3, DSA, RSA keySize < 2048
jdk.tls.disabledAlgorithms=SSLv3, RC4, MD5withRSA, DH keySize < 1024,
EC keySize < 224, DES40_CBC, RC4_40,3DES_EDE_CBC
将3DES_EDE_CBC注释掉即可
jdk.tls.disabledAlgorithms=MD5, SSLv3, DSA, RSA keySize < 2048
jdk.tls.disabledAlgorithms=SSLv3, RC4, MD5withRSA, DH keySize < 1024,
EC keySize < 224, DES40_CBC, RC4_40
#,3DES_EDE_CBC
动态连接数据库
- 依赖
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc6</artifactId>
<version>11.2.0.3</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.17</version>
</dependency>
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>mssql-jdbc</artifactId>
<version>7.2.2.jre8</version>
</dependency>
<!--用于动态连接-->
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>3.1.0</version>
</dependency>
- 动态连接代码
public HikariDataSource customDataSource() {
final HikariDataSource customDataConfig = new HikariDataSource();
customDataConfig.setJdbcUrl("数据库的url");
customDataConfig.setDriverClassName("数据库的驱动");
customDataConfig.setUsername("数据库用户名");
customDataConfig.setPassword("数据库密码");
customDataConfig.setMaximumPoolSize(2);
customDataConfig.setMinimumIdle(1);
customDataConfig.setAutoCommit(true);
//customDataConfig.setConnectionTestQuery("SELECT 1 FROM DUAL");
customDataConfig.addDataSourceProperty("cachePrepStmts", "true");
customDataConfig.addDataSourceProperty("prepStmtCacheSize", "250");
customDataConfig.addDataSourceProperty("prepStmtCacheSqlLimit", "2048");
return customDataConfig;
}
- 上述代码之中,可以从方法中传入参数,设置url,数据库驱动以及数据库用户名和密码来动态连接任意的数据库
- 数据库url和驱动的写法如下
String sqlserverUrl ="jdbc:sqlserver://localhost:1433;DatabaseName=数据库名称";
String sqlserverDriver="com.microsoft.sqlserver.jdbc.SQLServerDriver";
String mySqlUrl="jdbc:mysql://localhost:3307/数据库名称";
String mySqlDriver="com.mysql.cj.jdbc.Driver";
String oracleUrl="jdbc:oracle:thin:@//localhost:1521/数据库名称";
String oracleDriver="oracle.jdbc.OracleDriver";
//orcale也可以使用sid连接的url
String oracleUrl="jdbc:oracle:thin:@localhost:1521:SID";
- 连接数据库:
HikarDataSource dataSource=customDataSource();
NamedParameterJdbcTemplate jdbcTemplate = new NamedParameterJdbcTemplate(dataSource);
- 之后就可以使用jdbcTemplate来执行sql了
- 使用结束后关闭连接
dataSource.close()
- 事务的使用
public TransactionTemplate getTransactionTemplate(DataSource dataSource) {
PlatformTransactionManager txManager = new DataSourceTransactionManager(dataSource);
return new TransactionTemplate(txManager);
}
TransactionTemplate transactionTemplate = getTransactionTemplate(dataSource);
transactionTemplate.execute(status -> {
//回滚的方法
status.setRollbackOnly();
});