思路:在连接数据之前先打开一个ssh的连接,使用SSH将数据库转发为本地连接,然后使用本地连接去连接数据库
相关文章:http://stackoverflow.com/questions/1968293/connect-to-remote-mysql-database-through-ssh-using-java
http://stackoverflow.com/questions/33526427/spring-boot-ssh-mysql
需要添加maven:
<dependency>
<groupId>com.jcraft</groupId>
<artifactId>jsch</artifactId>
<version>0.1.53</version>
</dependency>
单独测试代码:
/**
* Created by YouGuessWho on 2017/3/28.
*/
import java.sql.*;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
public class SSHConnectTest {
static int lport;
static String rhost;
static int rport;
public static void go(){
String user = "SSHUser";
String password = "SSHPSW";
String host = "SSHHOST";
int port=SSHPORT;
try
{
JSch jsch = new JSch();
Session session = jsch.getSession(user, host, port);
lport = 3307;
rhost = "MYSQL_ADDRESS_YRL";
rport = 3306;
session.setPassword(password);
session.setConfig("StrictHostKeyChecking", "no");
System.out.println("Establishing Connection...");
session.connect();
int assinged_port=session.setPortForwardingL(lport, rhost, rport);
System.out.println("localhost:"+assinged_port+" -> "+rhost+":"+rport);
}
catch(Exception e){System.err.print(e);}
}
public static void main(String[] args) {
try{
go();
} catch(Exception ex){
ex.printStackTrace();
}
System.out.println("An example for updating a Row from Mysql Database!");
Connection con = null;
String driver = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://localhost:" + lport + "/";//" + rhost +"
String db = "target_database_test";
String dbUser = "dbUser";
String dbPasswd = "Db_psw";
try{
Class.forName(driver);
con = DriverManager.getConnection(url+db, dbUser, dbPasswd);
try{
Statement st = con.createStatement();
String sql = "select * from contracts " ;
ResultSet result = st.executeQuery(sql);
while(result.next()){
System.out.println(result.getString("name") + " ");
}
}
catch (SQLException s){
System.out.println("SQL statement is not executed!");
}
}
catch (Exception e){
e.printStackTrace();
}
}
}
集成:
@Configuration
@EnableJpaRepositories("cn..repository")
@EnableJpaAuditing(auditorAwareRef = "springSecurityAuditorAware")
@EnableTransactionManagement
@EnableElasticsearchRepositories("cn..repository.search")
public class DatabaseConfiguration {
private final Logger log = LoggerFactory.getLogger(DatabaseConfiguration.class);
@Inject
private Environment env;
@Autowired(required = false)
private MetricRegistry metricRegistry;
private SSHConnection conexionssh;
@Bean(destroyMethod = "close")
public DataSource dataSource(DataSourceProperties dataSourceProperties, EdiantiProperties ediantiProperties, CacheManager cacheManager) {
log.debug("Configuring Datasource");
try {
//打开SSH
conexionssh = new SSHConnection();
} catch (Throwable e) {
e.printStackTrace(); // error connecting SSH server
}
if (dataSourceProperties.getUrl() == null) {
log.error("Your database connection pool configuration is incorrect! The application" +
" cannot start. Please check your Spring profile, current profiles are: {}",
Arrays.toString(env.getActiveProfiles()));
throw new ApplicationContextException("Database connection pool is not configured correctly");
}
HikariConfig config = new HikariConfig();
config.setDataSourceClassName(dataSourceProperties.getDriverClassName());
config.addDataSourceProperty("url", dataSourceProperties.getUrl());
if (dataSourceProperties.getUsername() != null) {
config.addDataSourceProperty("user", dataSourceProperties.getUsername());
} else {
config.addDataSourceProperty("user", ""); // HikariCP doesn't allow null user
}
if (dataSourceProperties.getPassword() != null) {
config.addDataSourceProperty("password", dataSourceProperties.getPassword());
} else {
config.addDataSourceProperty("password", ""); // HikariCP doesn't allow null password
}
//MySQL optimizations, see https://github.com/brettwooldridge/HikariCP/wiki/MySQL-Configuration
if ("com.mysql.jdbc.jdbc2.optional.MysqlDataSource".equals(dataSourceProperties.getDriverClassName())) {
config.addDataSourceProperty("cachePrepStmts", ediantiProperties.getDatasource().isCachePrepStmts());
config.addDataSourceProperty("prepStmtCacheSize", ediantiProperties.getDatasource().getPrepStmtCacheSize());
config.addDataSourceProperty("prepStmtCacheSqlLimit", ediantiProperties.getDatasource().getPrepStmtCacheSqlLimit());
}
config.setMinimumIdle(ediantiProperties.getDatasource().getMinimumIdle());
config.setMaximumPoolSize(ediantiProperties.getDatasource().getMaximumPoolSize());
config.setConnectionTestQuery(ediantiProperties.getDatasource().getConnectionTestQuery());
config.setConnectionInitSql(ediantiProperties.getDatasource().getConnectionInitSql());
if (metricRegistry != null) {
config.setMetricRegistry(metricRegistry);
}
return new HikariDataSource(config);
}
@Bean
public Hibernate4Module hibernate4Module() {
return new Hibernate4Module();
}
}
交流:QQ群:391053981
支付宝打赏
微信打赏