偶然碰到这个需求,在各种百度下终于成功完成需求。第一次写博客,希望大家多多指教!
在开发过程中,我最开始的问题是如何用java程序连接远程数据库,为此百度了很久才成功连接上远程数据库。
而且需要需求是说不能在代码里写死远程数据库的地址,需要将数据源写在配置文件(db.properties)里。
db.properties内容如下:
driver=oracle.jdbc.OracleDriver
url=jdbc:oracle:thin:@localhost:1521:ORCL
user=tzsb
password=tzsb
driver1=com.microsoft.sqlserver.jdbc.SQLServerDriver
url1=jdbc:sqlserver://远程数据库地址:端口号;DatabaseName=数据库名称
user1=数据库用户名
password1=数据库密码
因为需要操作两个不同的数据库,所以我在配置文件里写好了远程数据库和本地数据库的数据源信息。
在此需要一个工具类来读取这个配置文件db.properties里面的数据源信息。这个工具类是ReadProperties。
ReadProperties.java内容如下:
package com.wintime.db;
import java.io.InputStream;
import java.util.Properties;
public class ReadProperties {
static private String driver = null;
static private String url = null;
static private String user = null;
static private String password = null;
//因为需要操作远程和本地两个数据库,所以需要定义两种变量,下面的get方法同理
static private String driver1 = null;
static private String url1 = null;
static private String user1 = null;
static private String password1 = null;
static {
loads();
}
synchronized static public void loads() {
if (driver == null || url == null || user == null || password == null) {
InputStream is = ReadProperties.class.getResourceAsStream("/db.properties");
Properties dbproperties = new Properties();
try {
dbproperties.load(is);
driver = dbproperties.getProperty("driver").toString();
url = dbproperties.getProperty("url").toString();
user = dbproperties.getProperty("user").toString();
password = dbproperties.getProperty("password").toString();
//因为需要操作远程和本地两个数据库,所以需要分别获取数据源信息
driver1 = dbproperties.getProperty("driver1").toString();
url1 = dbproperties.getProperty("url1").toString();
user1 = dbproperties.getProperty("user1").toString();
password1 = dbproperties.getProperty("password1").toString();
} catch (Exception e) {
System.err.println("不能读取属性文件. " + "请确保db.properties在CLASSPATH指定的路径中");
}
}
}
public static String getDriver1() {
if (driver1 == null)
loads();
return driver1;
}
public static String getUrl1() {
if (url1 == null)
loads();
return url1;
}
public static String getUser1() {
if (user1 == null)
loads();
return user1;
}
public static String getPassword1() {
if (password1 == null)
loads();
return password1;
}
public static String getDriver() {
if (driver == null)
loads();
return driver;
}
public static String getUrl() {
if (url == null)
loads();
return url;
}
public static String getUser() {
if (user == null)
loads();
return user;
}
public static String getPassword() {
if (password == null)
loads();
return password;
}
}
在写好工具类之后就开始最重要的部分,那就是连接远程数据库,并将数据同步到本地数据库中。
Yqxw.java内容如下:
package com.tzsb;
import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.wintime.db.ReadProperties;
public class Yqxw implements Runnable {
@Override
public void run() {
Connection conn = null;
Connection conn1 = null;
Statement stmt = null;
Statement stmt1 = null;
ResultSet rs = null;
ResultSet rs1 = null;
String sql = "";
String sql1 = "";
try {
//开始获取远程服务器的连接,要非常注意的地方是getDriver1()而不是 getDriver()因为db.properties配置文件中远程数据库的数据源信息是driver1而不是driver
Class.forName(ReadProperties.getDriver1());
//这里也要改成对应的getUrl1()、getUser1()和getPassword1()
conn1 = DriverManager.getConnection(ReadProperties.getUrl1(), ReadProperties.getUser1(),
ReadProperties.getPassword1());
//编写sql语句
sql = "select title,time,laiyuan,url,company from 远程数据库的某张表";
stmt = conn1.createStatement();
//执行查询的sql
rs = stmt.executeQuery(sql);
//因为查询出多条记录,并且每条记录有多个字段,所以用List
需要特别注意的一点是:如果将操作数据库的语句写在循环中时,一定要在操作后写关闭语句stmt1.close(); ,不然会报错java.sql.SQLException: ORA-00604: 递归 SQL 级别 1 出现错误。切记!!!
因为需求中说需要定时执行,所以还需要一个定时执行的程序YqxwSchedule.java。
YqxwSchedule.java内容如下:
package com.tzsb;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class YqxwSchedule {
/**
* 以固定周期频率执行任务
*/
public static void executeFixedRate() {
ScheduledExecutorService executor = Executors.newScheduledThreadPool(3);
// 每7天更新一次,需要定时执行时取消注释
//executor.scheduleAtFixedRate(new Yqxw(), 0, 7, TimeUnit.DAYS);
new Thread(new Yqxw()).start();
}
public static void main(String[] args) {
executeFixedRate();
}
}
在这个java文件中点击鼠标右键Run As——>Java Application就可以运行。
第一次写博客,如有错误之处,希望大家批评指正!