您的位置:首页 > 其它

数据中心与对外平台的积分同步

2015-05-30 21:50 267 查看
在公司做的项目,有两个不同的服务器,一个是数据中心,一个是对外平台。数据中心和对外平台中的用户是同步的。也就是说同一个用户可以在对外平台登录,也可以在数据中心登录。但是在给用户增加积分时,只保存在对外平台的数据库中。因此,同一个用户在登录对外平台是可以看到等级(根据积分来的),在数据中心里却看不见,因此要定时的同步对外平台和数据中心的积分数据。

1、写一个配置文件config.properties,用来保存两个数据库的连接信息。

jdbcDriverMysqlFY=com.mysql.jdbc.Driver

jdbcUrlMysqlFY=jdbc:mysql://172.18.10.146:3306/shfy_dwpt?characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull

jdbcUserMysqlFY=root
jdbcPasswordMysqlFY=12344

jdbcDriverMysqlSJZX=com.mysql.jdbc.Driver

jdbcUrlMysqlSJZX=jdbc:mysql://172.18.10.146:3306/shfy_sjzx?characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull

jdbcUserMysqlSJZX=root
jdbcPasswordMysqlSJZX=12344


2、写一个获得配置属性的工具类PropertiesUtil.java。

package com.sudytech.plugs.shfy.jifentongbu;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import java.util.logging.Level;
import java.util.logging.Logger;

public class PropertiesUtil {
private static Properties props = new Properties();
static {
ClassLoader loader = PropertiesUtil.class.getClassLoader();
InputStream is = loader.getResourceAsStream("com/sudytech/plugs/shfy/jifentongbu/config.properties");
try {
props.load(is);
} catch (IOException e) {
Logger.getLogger(PropertiesUtil.class.getName()).log(Level.SEVERE, null, e);
}
}
public static String getValue(String key) {
return props.getProperty(key);
}
}


3、创建对外平台和数据中心的数据库的连接工具MysqlDaoFY.java和MysqlDaoSJZX.java。
MysqlDaoFY.java

package com.sudytech.plugs.shfy.jifentongbu;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class MysqlDaoFY {
public static String DRIVER =PropertiesUtil.getValue("jdbcDriverMysqlFY");
public static String URL = PropertiesUtil.getValue("jdbcUrlMysqlFY");
public static String USER =PropertiesUtil.getValue("jdbcUserMysqlFY");
public static String PASSWORD = PropertiesUtil.getValue("jdbcPasswordMysqlFY");

public static Connection getConnection() {
Connection conn = null;
try {
Class.forName(DRIVER);
conn = DriverManager.getConnection(URL, USER, PASSWORD);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}

public static void closeAll(ResultSet rs, Statement stmt, Connection conn) {
try {
rs.close();
} catch (Exception ex) {
//ex.printStackTrace();
}
try {
stmt.close();
} catch (Exception ex) {
//ex.printStackTrace();
}
try {
conn.close();
} catch (Exception ex) {
//ex.printStackTrace();
}
}

public static int update(Connection conn,String sql, Object[] params) throws Exception {
PreparedStatement pstmt = null;
try {
pstmt = conn.prepareStatement(sql);
for (int i = 0; params != null && i < params.length; i++) {
pstmt.setObject(i + 1, params[i]);
}
return pstmt.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
throw e;
}
}

public static ResultSet query(Connection conn, String sql, Object[] params) throws Exception {
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
pstmt = conn.prepareStatement(sql);
for (int i = 0; params != null && i < params.length; i++) {
pstmt.setObject(i + 1, params[i]);
}
rs = pstmt.executeQuery();
} catch (Exception e) {
e.printStackTrace();
throw e;
}
return rs;
}
}


MysqlDaoSJZX.java

package com.sudytech.plugs.shfy.jifentongbu;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class MysqlDaoSJZX {
public static String DRIVER =PropertiesUtil.getValue("jdbcDriverMysqlSJZX");
public static String URL = PropertiesUtil.getValue("jdbcUrlMysqlSJZX");
public static String USER =PropertiesUtil.getValue("jdbcUserMysqlSJZX");
public static String PASSWORD = PropertiesUtil.getValue("jdbcPasswordMysqlSJZX");

public static Connection getConnection() {
Connection conn = null;
try {
Class.forName(DRIVER);
conn = DriverManager.getConnection(URL, USER, PASSWORD);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}

public static void closeAll(ResultSet rs, Statement stmt, Connection conn) {
try {
rs.close();
} catch (Exception ex) {
//ex.printStackTrace();
}
try {
stmt.close();
} catch (Exception ex) {
//ex.printStackTrace();
}
try {
conn.close();
} catch (Exception ex) {
//ex.printStackTrace();
}
}

public static int update(Connection conn,String sql, Object[] params) throws Exception {
PreparedStatement pstmt = null;
try {
pstmt = conn.prepareStatement(sql);
for (int i = 0; params != null && i < params.length; i++) {
pstmt.setObject(i + 1, params[i]);
}
return pstmt.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
throw e;
}
}

public static ResultSet query(Connection conn, String sql, Object[] params) throws Exception {
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
pstmt = conn.prepareStatement(sql);
for (int i = 0; params != null && i < params.length; i++) {
pstmt.setObject(i + 1, params[i]);
}
rs = pstmt.executeQuery();
} catch (Exception e) {
e.printStackTrace();
throw e;
}
return rs;
}
}


4、开始做积分同步了。

package com.sudytech.plugs.shfy.jifentongbu;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

public class T_POINTS_USERPOINTS {

private static String TABLE_NAME = "T_POINTS_USERPOINTS";
private static List<String> sqlString = new ArrayList<String>();

public static void doMethod() {
Connection con1 = null, con2 = null;
ResultSet rs1 = null,rs2 = null;
try {
con1 = MysqlDaoFY.getConnection();
StringBuffer querySql1 = new StringBuffer().append("SELECT * FROM " + TABLE_NAME);
rs1 = MysqlDaoFY.query(con1, querySql1.toString(), null);
con2 = MysqlDaoSJZX.getConnection();
con2.setAutoCommit(false);
StringBuffer querySql2 = new StringBuffer();
StringBuffer querySql3 = new StringBuffer();
while(rs1.next()) {
querySql2 = new StringBuffer().append("SELECT * FROM " + TABLE_NAME);
querySql2.append(" WHERE USERID="+rs1.getInt(3)+" AND MODULEID="+rs1.getInt(4));
//先查看数据中心是否存在符合条件的数据,存在则更新,否则新增加一条
rs2=MysqlDaoSJZX.query(con2, querySql2.toString(), null);
if(rs2.next()){//存在,更新
querySql3 = new StringBuffer().append("UPDATE "+TABLE_NAME+" SET SCORE = "+rs1.getInt(2));
querySql3.append(" WHERE USERID = "+rs1.getInt(3));
querySql3.append(" AND MODULEID = "+rs1.getInt(4));
}else{//不存在,插入
querySql3 = new StringBuffer().append("INSERT INTO "+TABLE_NAME);
querySql3.append(" (SCORE,USERID,MODULEID) VALUES (");
querySql3.append(rs1.getInt(2)+","+rs1.getInt(3)+","+rs1.getInt(4)).append(")");
}
sqlString.add(querySql3.toString());
}
Statement st = con2.createStatement();
for (String sql : sqlString) {
st.execute(sql);
System.out.println(sqlString);
}
con2.commit();
} catch (Exception e) {
e.printStackTrace();
try {
con2.rollback();
} catch (SQLException ex1) {
}
} finally {
MysqlDaoFY.closeAll(null, null, con1);
}
}

/**
* @param args the command line arguments
*/
public static void main(String[] args) {
doMethod();
}

}


5、因为是要定时实现积分同步,要写个线程,过一个小时触发一次方法,执行一次同步。
PointsDataSynServlet.java

package com.sudytech.plugs.shfy.jifentongbu;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import com.sudytech.log.ILog;
import com.sudytech.log.LogFactory;

public class PointsDataSynServlet extends HttpServlet{
private static ILog _log = LogFactory.getInstance().getLog(PointsDataSynServlet.class);
private PointsDataSynThread _PointsThread;

@Override
public void init() throws ServletException {
try {
System.out.println("开启积分同步线程。。。");
_PointsThread = new PointsDataSynThread();
_PointsThread.start();
} catch (Exception e) {
_log.error("servlet初始化失败", e);
}
}
}


PointsDataSynThread.java

package com.sudytech.plugs.shfy.jifentongbu;

import java.util.Timer;
import com.sudytech.log.ILog;
import com.sudytech.log.LogFactory;

public class PointsDataSynThread extends Thread{
private static ILog _log = LogFactory.getInstance().getLog(PointsDataSynThread.class);

public PointsDataSynThread() {
openTimer();
}

private void openTimer() {
new Timer().schedule(new MyTask(), 1 * 60, 1 * 60 * 1000 * 60 * 24);
}

public class MyTask extends java.util.TimerTask {

@Override
public void run() {
T_POINTS_USERPOINTS.doMethod();
}
}

}


6、最后要在配置文件中加上如下代码。

<!--纺院与数据中心积分同步线程-->
<servlet>
<servlet-name>PointsDataSynServlet</servlet-name>
<servlet-class>com.sudytech.plugs.shfy.pointsSynchronous.PointsDataSynServlet</servlet-class>
<load-on-startup>3</load-on-startup>
</servlet>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: