我有一个应用程序,它使用不同地理位置的四个数据库.所有数据库都包含相同的表,并且只有数据库名称根据位置而不同.我必须在我的应用程序中创建一些使用每个数据库中的数据的报告.从java应用程序创建这些数据库连接的正确方法是什么?是否有适合我可以使用的任务的设计模式?
在我的Qt应用程序中,我有一个基类如下.我正在使用QObject,因为我想在所有派生类中使用Signal-Slot机制.
class IRzPlugin : public QObject {
public:
virtual void registerMenu(QWidget*);
virtual void execute();
}
Run Code Online (Sandbox Code Playgroud)
然后我有另一个课程如下.我需要从QWidget扩展,因为我需要在所有派生类中实现事件处理方法.(mouseMoveEvent(),keyPressEvent().. etc);
class IRzLayeringPlugin : public IRzPlugin , public QWidget{
}
Run Code Online (Sandbox Code Playgroud)
但编译器给出了这些错误:
C:\svn\osaka3d\tags\iter08\prototype\osaka3d\rinzo\plugin\moc_IRzLayeringPlugin.cxx: In member function `virtual const QMetaObject* IRzLayeringPlugin::metaObject() const':
C:\svn\osaka3d\tags\iter08\prototype\osaka3d\rinzo\plugin\moc_IRzLayeringPlugin.cxx:51: error: `QObject' is an ambiguous base of `IRzLayeringPlugin'
C:\svn\osaka3d\tags\iter08\prototype\osaka3d\rinzo\plugin\moc_IRzLayeringPlugin.cxx:51: error: `QObject' is an ambiguous base of `IRzLayeringPlugin'
make[2]: *** [CMakeFiles/Rinzo.dir/plugin/moc_IRzLayeringPlugin.cxx.obj] Error 1
Run Code Online (Sandbox Code Playgroud) 在下面的代码片段(Spring 3)中:
@Transactional("txManager")
public class DaoHolder {
@Transactional(value="txManager", readOnly=false, propagation=Propagation.REQUIRES_NEW, rollbackFor={Exception.class})
private void runTransactionalMethod() throws Exception {
dao1.insertRow();
dao2.insertRow();
//throw new Exception();
}
//...
}
Run Code Online (Sandbox Code Playgroud)
上面的代码以事务方式正常工作 - 特别是,当没有抛出异常时,每个dao操作都被提交(到2个不同的数据源).抛出异常时,每个dao操作都会回滚.
我的问题是:它为什么有效?我读到的任何地方我都被告知在处理多个数据源时使用JtaTransactionManager.我不想使用JTA.如果我让它在HibernateTransactionManager下运行会有什么后果?
感兴趣的更多细节:
每个数据源的定义如下:
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="${jdbc.driverClassName}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<property name="initialSize" value="${jdbc.initial_size}" />
<property name="maxActive" value="${jdbc.max_active}" />
</bean>
Run Code Online (Sandbox Code Playgroud)
每个会话工厂的定义如下:
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="mappingResources">
<list>
... multiple …Run Code Online (Sandbox Code Playgroud) 我有一个Symfony命令行任务,习惯于删除mysql连接.
它是一个数据导入任务.从多个连接中获取数据.它不是一个大问题,而是一些较小的查询.
它似乎在第一次运行时丢弃连接.大约一半的脚本.然而,它第二次运行(从头开始)它总是完成任务.
它没有超时查询,因为我得到的错误响应是连接已被删除,它自己运行正常.因此,我认为它的某种超时问题是由于查询缓存加速脚本而第二次运行时避免的.
所以我的问题是如何刷新数据库连接?
[Doctrine\DBAL\DBALException]
SQLSTATE [HY000]:常规错误:2013查询期间与MySQL服务器的连接丢失
我们正在设计一种可以支持多个数据库的产品.我们目前正在做这样的事情,以便我们的代码支持MS SQL以及MySQL:
namespace Handlers
{
public class BaseHandler
{
protected string connectionString;
protected string providerName;
protected BaseHandler()
{
connectionString = ApplicationConstants.DatabaseVariables.GetConnectionString();
providerName = ApplicationConstants.DatabaseVariables.GetProviderName();
}
}
}
namespace Constants
{
internal class ApplicationConstants
{
public class DatabaseVariables
{
public static readonly string SqlServerProvider = "System.Data.SqlClient";
public static readonly string MySqlProvider = "MySql.Data.MySqlClient";
public static string GetConnectionString()
{
return ConfigurationManager.ConnectionStrings["CONNECTION_STRING"].ConnectionString;
}
public static string GetProviderName()
{
return ConfigurationManager.ConnectionStrings["CONNECTION_STRING"].ProviderName;
}
}
}
}
namespace Handlers
{
internal class InfoHandler : BaseHandler
{ …Run Code Online (Sandbox Code Playgroud) 我有一个iOS项目,包含一个大型的预加载数据库和一个小型用户数据库(两个CoreData SQLite存储).以前的问题建议使用配置来控制哪些实体与哪个商店一起使用.我无法让它工作.这是我一直在努力的...
- (NSManagedObjectModel *)managedObjectModel
{
if (_managedObjectModel != nil) return _managedObjectModel;
// set up the model for the preloaded data
NSURL *itemURL = [[NSBundle mainBundle] URLForResource:@"FlagDB" withExtension:@"momd"];
NSManagedObjectModel *itemModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:itemURL];
// set up the model for the user data
NSURL *userDataURL = [[NSBundle mainBundle] URLForResource:@"UserData" withExtension:@"momd"];
NSManagedObjectModel *userDataModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:userDataURL];
// merge the models
_managedObjectModel = [NSManagedObjectModel modelByMergingModels:[NSArray arrayWithObjects:itemModel, userDataModel, nil]];
// define configurations based on what was in each model
WRONG [_managedObjectModel setEntities:itemModel.entities …Run Code Online (Sandbox Code Playgroud) 我有两个Entitymanagerbean配置.每个指向具有不同模式的单独数据库(一个是Oracle,另一个是内存中的H2)
我该怎么做才能解决Entitymanager应该用于每个存储库的模糊性?现在我收到这个错误:
No unique bean of type [javax.persistence.EntityManagerFactory] is defined:
expected single bean but found 2
Run Code Online (Sandbox Code Playgroud)
我想我可以通过使用类似的东西来提供快速修复
<jpa:repositories base-package="com.foo.repos.ora"
entity-manager-factory-ref="entityManagerFactoryA">
<jpa:repositories base-package="com.foo.repos.m2"
entity-manager-factory-ref="entityManagerFactoryB">
Run Code Online (Sandbox Code Playgroud)
但希望有更好的解决方案.
编辑:
我给你一个当前场景的想法:
Spring-Config:有两个EM
<jpa:repositories base-package="com.foo.repos.ora" entity-manager-factory-ref="entityManagerFactory"/>
<jpa:repositories base-package="com.foo.repos.m2" entity-manager-factory-ref="entityManagerFactory2"/>
<context:component-scan base-package="com.foo" /> ....
Run Code Online (Sandbox Code Playgroud)
这里的所有内容都在"package com.foo.repos.ora"中.遵循如何创建自定义存储库的模式我得到两个接口'ARepository','ARepositoryCustom'及其实现'ARepositoryImpl'就像这样
@Repository
public interface ARepository extends ARepositoryCustom, JpaRepository<myEntity, BigDecimal>, QueryDslPredicateExecutor {
}
public interface ARepositoryCustom {
FooBar lookupFooBar()
}
public class ARepositoryImpl extends QueryDslRepositorySupport implements ARepositoryCustom {
ARepositoryImpl(Class<?> domainClass) {
super(domainClass.class)
}
ARepositoryImpl() {
this(myEntity.class)
}
@Override
FooBar …Run Code Online (Sandbox Code Playgroud) 我有多个连接,我有一个存储库类.我希望存储库类可以访问多个连接.它用于需要从多个数据库主机获取数据的报告.
config.yml
doctrine:
dbal:
default_connection: default
connections:
default:
driver: "%db_default_driver%"
host: "%db_default_host%"
etc..
bookings:
driver: "%db_readonly_bookings_driver%"
host: "%db_readonly_bookings_host%"
etc ...
sessions:
etc..
Run Code Online (Sandbox Code Playgroud)
SalesJournalRepistory.php
namespace Portal\SalesJournalBundle\Repository;
use Doctrine\ORM\EntityRepository;
class SalesJournalRepository extends EntityRepository
{
public $connDefault = null;
public $connBookings = null;
public $connSessions = null;
function __construct()
{
// this is where I get the error
$this->connDefault = $this->getManager('default')->getConnection();
$this->connBookings = $this->getManager('bookings')->getConnection();
$this->connSessions = $this->getManager('sessions')->getConnection();
}
function testQuery(){
$sql = "SELECT * FROM testTableBookings LIMIT 10";
$stmt = $this->connBookings->prepare($sql);
$results = …Run Code Online (Sandbox Code Playgroud) 我试图在Glassfish上部署的Java EE应用程序中的同一事务中使用2个持久性单元.
这两个持久性单元在persistence.xml中定义,如下所示:
<persistence-unit name="BeachWater">
<jta-data-source>jdbc/BeachWater</jta-data-source>
...
<persistence-unit name="LIMS">
<jta-data-source>jdbc/BeachWaterLIMS</jta-data-source>
...
Run Code Online (Sandbox Code Playgroud)
这些持久性单元对应于我在Glassfish中定义的JDBC资源和连接池,如下所示(这里包括一个,因为两者在名称和数据库连接信息之外是相同的):
JDBC Resource:
JNDI Name: jdbc/BeachWaterLIMS
Pool Name: BEACHWATER_LIMS
Connection Pool:
Name: BEACHWATER_LIMS
Datasource Classname: com.microsoft.sqlserver.jdbc.SQLServerConnectionPoolDataSource
Resource Type: javax.sql.ConnectionPoolDataSource
Run Code Online (Sandbox Code Playgroud)
有3个无状态会话bean,LimsServiceBean,AnalysisServiceBean和AnalysisDataTransformationServiceBean.
以下是LimsServiceBean的相关摘录:
@PersistenceContext(unitName = "LIMS")
EntityManager em;
...
public ArrayList<Sample> getLatestLIMSData() {
Query q = em.createNamedQuery("Sample.findBySubTypeStatus");
return new ArrayList<Sample>(q.getResultList());
}
Run Code Online (Sandbox Code Playgroud)
来自AnalysisServiceBean:
@PersistenceContext(unitName = "BeachWater")
EntityManager em;
...
public ArrayList<AnalysisType> getAllAnalysisTypes() {
Query q = em.createNamedQuery("AnalysisType.findAll");
return new ArrayList<AnalysisType>(q.getResultList());
}
Run Code Online (Sandbox Code Playgroud)
并从AnalysisDataTransformationServiceBean:
@EJB
private AnalysisService analysisService;
@EJB
private LimsService limsService;
public void …Run Code Online (Sandbox Code Playgroud) transactions glassfish multiple-databases persistence-unit ejb-3.0
我正在构建一个SAAS应用程序,我们正在讨论每个客户端与共享数据库之间的一个数据库.我已经阅读了很多内容,其中包含了一些主题,但我还是有很多疑问.
我们的平台应该由每个客户高度定制.(他们应该能够拥有自定义表并向现有表添加自定义字段).在这种情况下,多数据库方法看起来很棒.
问题是.我的"用户"表应该在主数据库中还是在每个客户端数据库中?用户可能拥有一个或多个组织,因此它将存在于多个数据库中.那么,像国家表等通用表怎么样?
在master数据库中是有意义的.但是我有许多带有created_by字段的表,它们具有用户的外键.客户端也有一些权限相关的表.
如果有多个数据库,我会失去外键的强大功能,这意味着对数据库的查询更多.我知道我可以在数据库之间使用交叉连接,如果它们在同一台服务器中,那么我就会失去可扩展性.(我将来可能需要有多个数据库服务器).我已经考虑了联邦表.不确定性能.
我使用的技术是php和symfony 2框架以及数据库的mysql.
另外,我担心维护这样一个系统.我们可以创建一些脚本来自动化所有数据库中的模式更改,但是如果我们有10k客户端就意味着10k数据库.
你对此有何看法?我的应用程序的主要特点应该是灵活性,所以如果客户需要比基本平台没有的更具体的东西,应该可以为他做.
database architecture database-design multiple-databases multi-tenant