开发网页游戏过程记录9-数据库操作

考虑到游戏可能会接受大量的用户访问,这时需要考虑使用主从数据库切换来操作数据库里的数据,主从数据库的定义自然也放在一个enum中,以便于取得和设置,具体代码如下:

public enum MasterSlave { /** The Master. */ Master("MASTER"), /** The Slave. */ Slave("SLAVE"); /** The value. */ private final String value; /** * Instantiates a new master slave. * * @param value the value */ MasterSlave(String value) { this.value = value; } /** * Value. * * @return the string */ public String value() { return value; } } 如何实现主从数据库的切换呢?想要切换数据库的形式主要还是实现主从的交替取和放,自然使用ThreadLocal来存放会比较理想,代码如下:

public abstract class MasterSlaveUtils { /** The Constant useSlave. */ private static final ThreadLocal<MasterSlave> masterSlave = new ThreadLocal<MasterSlave>(); /** The Constant masterSlave_. */ private static final ThreadLocal<MasterSlave> masterSlave_ = new ThreadLocal<MasterSlave>(); /** * 获取当前数据库服务器设置(主 或 从) * * @return */ public static MasterSlave getServer() { MasterSlave us = masterSlave.get(); if (us != null) { return us; } else { return MasterSlave.Master; } } /** * 切换从数据库服务器. */ public static void changeToSlave() { masterSlave_.set(getServer()); masterSlave.set(MasterSlave.Slave); } /** * 切换主数据库服务器. */ public static void changeToMaster() { masterSlave_.set(getServer()); masterSlave.set(MasterSlave.Master); } /** * 重置主从设置. */ public static void resetServer() { masterSlave.set(masterSlave_.get()); } }定义了这两个类后,接着如果使用ORM框架(比如我这里使用hibernate)来进行数据操作时,如何区分操作的数据库到底是master还是slave呢?我们这里姑且使用得到HibernateTemplate的方式来区分,如果是slave,就使用自己封装的DaoSupport里定义的HibernateTemplate属性,如private HibernateTemplate slaveHibernateTemplate;如果是master就是用Hibernate自己的HibernateDaoSupport里定义的HibernateTemplate属性。具体代码如下:

/** * 获取Hibernate操作模板 * * @return HibernateTemplate */ public HibernateTemplate getDaoTemplate() { if (MasterSlaveUtils.getServer() == MasterSlave.Slave) { return this.getSlaveHibernateTemplate(); } else { return this.getHibernateTemplate();//返回HibernateDaoSuppor类中的hibernatetemplate } }public HibernateTemplate getSlaveHibernateTemplate() { return slaveHibernateTemplate;//返回自己类中的hibernatetemplate } 这样就可以使用hibernatetemplate对数据库中的数据进行增删改查刷了,增删改查时需要注意CacheMode和LockMode的使用。当然还会对session的绑定和释放,代码如下:

// 绑定session资源 private void initDeferredClose(SessionFactory sf) { if (!TransactionSynchronizationManager.hasResource(sf)) { Session session = SessionFactoryUtils.getSession(sf, true); TransactionSynchronizationManager.bindResource(sf, new SessionHolder(session)); } } // 销毁session资源 private void processDeferredClose(SessionFactory sf) { SessionHolder sessionHolder = (SessionHolder) TransactionSynchronizationManager .unbindResource(sf); SessionFactoryUtils.closeSession(sessionHolder.getSession()); }这个操作以后文章中还会涉及到相关内容。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值