数据库中数据量很大, 但又不可以删除时同时又要优化程序检索数据时间。
答:方式有很多比如 创建数据库表分区,创建索引, 存储过程等; 我这里采用动态创建数据库表的方式。
完全可以在不创建表分区情况下实行分表管理 例如 日志记录表 将日期(yyyy-MM)作为默认表后缀动态追加, 例如 文章发布表 将用户名作为后缀名进行动态追加 ;
动态创建数据库表的方式要具体问题具体分析, 比如JDBC中直接使用create table 表名_dynamicStr(...); 还可以使用hibernate的sql查询,不使用hql就不用走.hbm.xml文件了.
文章发布系统 dynamicStr 可以用已注册登陆的用户名, 日志记录表 dynamicStr 可以采用 'log_'+new SimpleDateFormat("yyyyMM").format(new Date());
下面例子是使用hibernate动态创建数据库表的例子,缺点是每次都要创建sessionFactory对象如果不同用户在同一时间段内不停的发布信息那是相当好系统资源的事情不可取,用在局域网系统还算靠谱 如果有兴趣可以将下面的代码抽取成动态创建表的Utils.
public class ReportDBApi {
private SessionFactory sessionFactory = null;
public ReportDBApi(){
createSession();
}
public void createSession(){
Date date = new Date();
SimpleDateFormat simpledateformat = new SimpleDateFormat("yyyyMMdd");
String now_time = simpledateformat.format(date);
String tablename = "TBL_REPORT_STATUS_20050707";
tablename = "TBL_REPORT_STATUS_" + now_time;
try {
Configuration cfg = new Configuration().addClass(cn.sports.vas.sms.unicom.TblReportStatus.class).configure();
Table table = cfg.getClassMapping(TblReportStatus.class).getTable();
table.setName(tablename);
cfg.getClassMapping(TblReportStatus.class).setTable(table);
sessionFactory = cfg.buildSessionFactory();
}
catch (MappingException ex) {
ex.printStackTrace();
}catch (HibernateException ex) {
ex.printStackTrace();
}
}
public void insertPO(TblReportStatus po) throws HibernateException {
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
session.save(po);
tx.commit();
session.close();
}
public void closeSession() throws HibernateException {
sessionFactory.close();
}
}