![]() |
只能说,当初没想好,导致现在的维护扩展困难,所以节哀吧,根据实际情况去改吧,,,都是半夜统计前一天的数据,然后第二天查看前一天的数据,如果实时性要求高的统计,那是不允许 这样做咯
|
![]() |
|
![]() |
如果要把Tomcat部署到客户本机的话,我想一小时从服务器抓取一次数据比较合适吧?隔一天是不是有点久了 。。 |
![]() |
现在就是有这么一个需求,我们的系统在网上供客户访问,客户搞个需求想在断网的时候也可以进行一些重要的操作,所以只能针对现在项目想些解决方案了。客户端也考虑过,试着用javaFX做了几个模型,发现些问题:1是太难看了,2 是javaFX网上资料太少,周期短的基础上进行深度开发不太现实。。所以又把注意力转到Web上了 |
![]() |
这个时间根据你的业务需求看吧,因为我们的数据量有点大,一个小时都跑步完的,而且白天跑的时候对系统存在一定压力,所以一般都是半夜跑,这个请根据你的实际情况分析,呵呵 |
![]() |
想多了吧,你见过web还能离线?web的意思就是东西都在服务器上,客户端只有一个浏览器而已,这种怎么离线,赶快停止你老板稀奇的设想,不然你下一步就是要开发一个pc客户端了。
|
![]() 80分 |
你可以考虑用tomcat mini+derby+jre打包成客户端,然后在主系统做个模块:
1、上传用户安装路径 2、操作离线功能的启动和停止(运行bat或者exe 启动服务) 3、数据同步,数据可以同步一次删除一次旧数据(用户可以手动同步和自动同步数据) 还有是否所有功能都需要离线的问题。 |
![]() 20分 |
WEB是不能离线的,转移也没用。不过我倒想到一种用C+JS+HTML。用HTML与JS做一个界面,然后用C写一个应用框架,主要功能是读取本地文件与保存文件等,并提供给JS调用的API,用JS调用C来完成文件的存储与修改等,在离线时就可以用这一套。在线时就把本地文件与线上的数据库同步。写好之后也像一个伪桌面应用程序了,直接把客户端发给客户。
|
![]() |
apache mina项目提供了http/ftp/xmpp服务,而derby数据库最适合小型的数据存储,你只要把项目部分功能放在mina项目目录中,然后web控制启动就可以达到一个小型服务器的效果了。
|
![]() |
那没办法了,我们情况还比较特殊。如果部署也只是在客户的电脑上安装一个Tomcat配置应用程序。只能白天定时跑,晚上客户就关机回家了 。。 |
![]() |
我也想停止啊,可是停不下来的赶脚~ 只能硬着头皮做了 看能做出个什么东西 |
![]() |
嗯,你说的这个是需要我把本地版本开发完成后,把WEB打包安装的内容吧?现在考虑还有点早 ~ |
![]() |
|
![]() |
我现在遇到一个问题,就是以目前的需求情况我需要在项目中配置两个数据源(本地、远程)在同步的时候切换,我现在使用Spring的方式,继承AbstractRoutingDataSource类完成在代码上手动切换。
private boolean doBaseCompany() {
if (!Boolean.valueOf(prop.get("BaseCompany").toString()))
return true;
DBContextHolder.setCustomerType(DBContextHolder.DATASOURCE_LOCAL); // 切换数据源到本地
SysRole role = new SysRole();
role.setCompanyId("lindp1");
role.setRoleName("lindp1");
sysRoleDao.addSysRole(role);
DBContextHolder.setCustomerType(DBContextHolder.DATASOURCE_REMOTE); // 切换数据源到远程
SysRole role2 = new SysRole();
role2.setCompanyId("lindp2");
role2.setRoleName("lindp2");
sysRoleDao.addSysRole(role2);
return true;
}
就是通过上面代码实现数据库切换,可是我添加的时候定时器第一次执行只会给远程数据库添加两条(lindp1、lindp2)的数据,本地数据库根本没操作。不知道是不是事务的问题?是不是要配置分布式事务啊? |
![]() |
数据问题我都没有考虑线程,有必要使用线程吗?定时器也可以吧 |
![]() |
动态获取数据源需要线程 |
![]() |
你参考下http://blog.csdn.net/shuai825644975/article/details/17021181
|
![]() |
对,我就是使用这种方式配置的多数据源。我的事务不起作用,家了@Transactional注解后第一次加载数据源无效,使用的是默认数据源 。。 |
![]() |
你调用第二个数据源前执行了线程的remove()以及commit事务了吗?
|
![]() |
那你用mq啊。
|
![]() |
MQ是什么 全称叫啥 我搜搜看 |
![]() |
我就没用线程,一直在使用定时器。 |
![]() |
你参考下JBOSS XA数据源
standalone.xml <datasources> <datasource jndi-name="java:jboss/datasources/ExampleDS" pool-name="ExampleDS" enabled="true" use-java-context="true"> <connection-url>jdbc:h2:mem:test;DB_CLOSE_DELAY=-1</connection-url> <driver>h2</driver> <security> <user-name>sa</user-name> <password>sa</password> </security> </datasource> <xa-datasource jta="true" jndi-name="java:jboss/datasources/MYDB_ONE" pool-name="MYDB_ONE" enabled="true" use-java-context="true" use-ccm="true"> <xa-datasource-property name="ServerName"> localhost </xa-datasource-property> <xa-datasource-property name="DatabaseName"> MYDB_ONE </xa-datasource-property> <xa-datasource-property name="SelectMethod"> cursor </xa-datasource-property> <xa-datasource-class>com.microsoft.sqlserver.jdbc.SQLServerXADataSource</xa-datasource-class> <driver>sqljdbc</driver> <xa-pool> <is-same-rm-override>false</is-same-rm-override> </xa-pool> <security> <user-name>some_user</user-name> <password>some_password</password> </security> <validation> <valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.mssql.MSSQLValidConnectionChecker"/> </validation> </xa-datasource> <xa-datasource jta="true" jndi-name="java:jboss/datasources/MYDB_TWO" pool-name="MYDB_TWO" enabled="true" use-java-context="true" use-ccm="true"> <xa-datasource-property name="ServerName"> localhost </xa-datasource-property> <xa-datasource-property name="DatabaseName"> MYDB_TWO </xa-datasource-property> <xa-datasource-property name="SelectMethod"> cursor </xa-datasource-property> <xa-datasource-class>com.microsoft.sqlserver.jdbc.SQLServerXADataSource</xa-datasource-class> <driver>sqljdbc</driver> <xa-pool> <is-same-rm-override>false</is-same-rm-override> </xa-pool> <security> <user-name>some_user</user-name> <password>some_password</password> </security> <validation> <valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.mssql.MSSQLValidConnectionChecker"/> </validation> </xa-datasource> <drivers> <driver name="h2" module="com.h2database.h2"> <xa-datasource-class>org.h2.jdbcx.JdbcDataSource</xa-datasource-class> </driver> <driver name="sqljdbc" module="com.microsoft.sqlserver.jdbc"> <driver-class>com.microsoft.sqlserver.jdbc.SQLServerDriver</driver-class> </driver> <driver name="postgresql" module="org.postgresql"> <xa-datasource-class>org.postgresql.xa.PGXADataSource</xa-datasource-class> </driver> </drivers> </datasources> springJpaConfig.xml <!-- Use @PersistenceContext annotations for injecting entity managers --> <bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" /> <!-- Set up JTA transaction manager --> <tx:jta-transaction-manager /> <bean id="entityManagerFactoryMyDB" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> <property name="persistenceUnitName" value="MyDB" /> <property name="dataSource" ref="dataSourceMyDB" /> <property name="packagesToScan" value="my.package.with.jpa.entities" /> <property name="jpaVendorAdapter"> <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> <property name="showSql" value="true" /> </bean> </property> <property name="jpaPropertyMap"> <map> <entry key="javax.persistence.transactionType" value="jta" /> <entry key="hibernate.transaction.jta.platform" value="org.hibernate.service.jta.platform.internal.JBossAppServerJtaPlatform" /> <entry key="jboss.entity.manager.factory.jndi.name" value="java:app/MyDBEntityManagerFactory" /> <entry key="hibernate.dialect" value="org.hibernate.dialect.SQLServer2008Dialect" /> </map> </property> </bean> <bean id="dataSourceMyDB" class="some.package.AbstractRoutingDataSourceMyDB"> <property name="lenientFallback" value="false" /> <property name="defaultTargetDataSource" value="java:jboss/datasources/ExampleDS" /> <property name="targetDataSources"> <map key-type="String"> <!-- This is a placeholder that will be filled in by BeanFactoryPostProcessor --> </map> </property> </bean> <!-- This allows us to modify Spring configuration load the list of datasources --> <bean class="some.package.DatasourceRegisteringBeanFactoryPostProcessor" /> DatasourceRegisteringBeanFactoryPostProcessor.java
package some.package
class DatasourceRegisteringBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {
HashMap<String, String> connectionsListMyDB = new HashMap<>();
// Load your connection list from wherever you need to, you can
// enumerate them directly from JNDI or some configuration location
connectionsListMyDB.put("db1", "java:jboss/datasources/MYDB_ONE");
connectionsListMyDB.put("db2", "java:jboss/datasources/MYDB_TWO");
if (connectionsList.isEmpty())
throw new RuntimeException("No JPA connections defined");
// Configure the dataSource bean properties
BeanDefinitionRegistry factory = (BeanDefinitionRegistry) beanFactory;
MutablePropertyValues mpv = factory.getBeanDefinition("dataSourceMyDB").getPropertyValues();
ManagedMap<String, String> mm = (ManagedMap<String, String>) mpv.getPropertyValue(
"targetDataSources").getValue();
mm.clear();
for (Entry<String, String> e : connectionsListMyDB.entrySet()) {
mm.put(e.getKey(), e.getValue());
}
}
}
AbstractRoutingDataSourceMyDB.java
public class AbstractRoutingDataSourceMyDB extends AbstractRoutingDataSource {
@Override
protected Object determineCurrentLookupKey() {
return getDbConnectionMyDB();
}
// ThreadLocal variable so that the connection gets set for the current thread
// using spring""s request scope on the class instead of ThreadLocal would also work here.
private final ThreadLocal<String> contextHolder = new ThreadLocal<String>();
public void setDbConnectionMyDB(String myKey) {
Assert.notNull(myKey, "myKey cannot be null");
contextHolder.set(myKey);
String k = contextHolder.get();
}
public String getDbConnectionMyDB() {
return (String) contextHolder.get();
}
public void clearDbConnectionMyDB() {
contextHolder.remove();
}
}
SomeTableDAO.java
@PersistenceContext(unitName = "MyDB")
private EntityManager em;
@Autowired
private AbstractRoutingDataSourceMyDB routingSource;
public void someMethod(int id) {
em.flush();
em.clear();
routingSource.setDbConnectionMyDB("db1");
em.remove(em.getReference(Something.class, id)); // delete something in db1
em.flush();
em.clear();
routingSource.setDbConnectionMyDB("db2");
em.remove(em.getReference(Something.class, id)); // delete something else with the same id in db2
}
|

