以前上学的时候数据库学的是皮毛中的皮毛,唯一的课程设计也只是跑几个简单得很得SQL语句而已。无论是数据库设计,还是SQL语句的各种经典写法和强大功能都没有怎么好好地研究过。
功能上的学习都不全面,就更不要提性能、安全和大数据量等等在实际应用中会遇到的问题勒。参与的一个项目中,就涉及到比较大量的数据量的处理和存储(当然处理大数据量就是另外一个问题勒)。加之分配给数据库所在的磁盘空间相当有限,造成了非常捉襟见肘的局面。
幻想着有朝一日可以不为这些事情烦恼,像google,sina一样,用几十上百台配置一般的机器连起来也能作为一个强壮的server。
从网上看到一些关于存储海量数据的讨论:
1、分表、分数据库
根据一定的规则把不同的数据库表分开
缺点:有一定风险,因为一旦分开存放的两个数据库表有朝一日需要“联表”操作,那么就郁闷了,而且最好是把几个数据量大的表分开,单独拎出来几个小表意义很不大,而且业务逻辑层的代码需要知道自己要处理的数据存在哪个服务器里,有一点儿奇怪。
例如:(来自ball_lei)
我现在采用的架构采用数据库群的方式,每个客户的数据单独存在一台数据库服务器上,所有的客户根据一定的规则安排存放的数据库服务器,在主数据库服务器上有一张-索引表保存客户与数据库服务器的对应关系,每台数据库服务器中用于存放这些数据的表按照月份分成12张,每张存放当月的全部客户的数据,目前计算出单台服务器-单表需要容纳9亿条数据,并且每台服务器在这种方式下可以容纳10000个客户的数据,以后客户数量增加时只需要增加数据库服务器即可。
程序逻辑,我采用业务逻辑层的概念,对外提供应用服务器接口,全部的客户端通过应用服务器接口进行业务运算,应用服务器我也采用服务器群的概念,有一个主的应用服务器,有几个副应用服务器,全部客户端只知道该主应用服务器的地址,上线时登陆主应用服务器,然后主应用服务器根据各台应用服务器的负载情况返回给客户端真正的登陆地址(副应用服务器的地址),然后客户端再登陆到上面进行业务处理,每台应用服务器都能够访问各台数据服务器进行数据提取。
问题:需要每台应用服务器都配备一个公网ip么,还是有其他的方式可以只需要一个公网ip可以给全部的服务器公用?Nat能够实现么?或者能否进行更好的负载均衡,就是客户端的各种业务都可以在不同的服务器上运算
改进:
用户规则配置应该不大,所以也可以做成配置一次Load到内存中。
如此大数据量的项目竟不用Oracle,实在让人费解。我现在的月数据量大概2.5亿,用了3台HP
SUPERDEMO,9个CUSTERMOR DB。其中一个CATALOG数据库,相当于你的客户索引。
你的插入操作很多,所以建议少建几个索引,其实一些业务完全可以在数据库中完成,通过触发器,约束和存储过程,这样性能会有大的提高。大数据的表,分区的确是必须的,当然,还需要更完善的维护计划,否则很容易,你的业务可能就会因为性能问题挂起了。
1、通过(数据库+文件)方式进行数据存储
2、集群方案
还有当初选修的“分布式数据库”,不知道这个概念是不是能够活生生的用到项目中来。。。
DAO层: JUnit test,需要用dbunit恢复现场;
service层:JUnit test,需要用dbunit恢复现场,逻辑更重要些,分支覆盖更重要些;
action:不做测试;
selenium:做集成测试。
尽管有人认为struts action不需要做测试,不过无意中看到strutsTestCase这个东东,还没有试,用途是测试struts的action.觉得比较有用.
尤其是,如果web页面交由第三方来做的话,那么单独对action进行测试就是十分有必要的.
但是,如果整个web系统从前台到后台都是一个team来做,那么个人认为还不如跟页面一起集成测,毕竟这是真实情况,而且从页面上可视性更强,更容易发现问题.与此同时,使用脚本录制回放测试工具(还没有试过)提高效率.
“jMock利用mock objects思想来对Java code进行测试。jMock具有以下特点:容易扩展,让你快速简单地定义mock objects,因此不必打破程序间的关联,你定义灵活的超越对象之间交互作用而带来测试局限,减少你测试地脆弱性。”
跟JMock功能类似的还有EasyMock。
简单试验后的感觉没有试验DBUnit后的感觉强烈,试了DBUnit的感觉是这东西以后一定要用.
但个人认为mock object这种东西能不用就不用,模拟来模拟去,最后还是要和真东西联调,所以mock的阶段应该是尽可能的短才是.
使用模仿对象进行测试的常用编码样式是:
· 创建模仿对象的实例
· 设置模仿对象中的状态和期望值
· 将模仿对象作为参数来调用域代码
· 验证模仿对象中的一致性
代码中的大概过程:
Mock mock = new Mock(**.class);//构造一个那个类的mock对象,把这个类传入Mock
使用mock.expects方法,来设置想要执行的操作:执行几次、执行哪个方法、传什么参、返回什么值
获得那个mock对象:** x = (**)mock.proxy();//proxy方法返回代理类实例,即虚拟对象实例
然后run **.class的那个方法(call methods on the mock object, expectation on it will deliver the result set up by yourself)
写mock-object 测试,需要有独立的接口作为mock的对象(从而促进了针对接口编程的习惯),还有个好的副作用:他迫使你来重写一些代码。实际上,代码常常写的不好。你让类和环境之间产生了不必要的耦合。
DBUnit扩展自JUnit.在使用DBUnit之前,为了验证自己编写的涉及数据库操作方法的正确性,每次都要执行一个简单的sql脚本,灌些数据,然后人眼观察着数据表中的数据.然后,代码执行完毕后,再次观察数据变化情况.久而久之,表里面的数据就变得杂乱,一般会全部删除,重新来过.
DBUnit的目标正是保证数据库数据环境的稳定性,具备将数据库中数据与xml文件之间双向转换的能力.
试验了一下,
首先,下载dbunit的jar包,加入工程即可.
1.从xml中将数据导入数据库表
tc不再继承自TestCase,而是继承DatabaseTestCase
覆盖几个方法,包括获得xml文件内容,获得DB连接,以及在setup方法和teardown方法中调用提供的dbunit操作类型,构建数据库内数据环境.
这时,我以为如果只有几个简单的数据,写xml固然简单,但想测试大数据量时(虽然UT主要是测试功能而非性能,但是大数据量也方便验证)就有点问题,好在是双向的,可以先把数据用function灌入数据库,再导进xml里面:
2.从数据库表数据导入xml文件
用ant+DBUnit来完成这个任务非常方便!
<
target
name
="export"
>
<
taskdef
name
="dbunit"
classname
="org.dbunit.ant.DbUnitTask"
classpathref
="compile.path"
/>
<
dbunit
driver
="com.mysql.jdbc.Driver"
url
="jdbc:mysql://127.0.0.1:3306/mydb"
userid
="root"
password
="root"
supportBatchStatement
="true"
>
<
export
dest
="${test.srcpath}/export.xml"
>
<
query
name
="test_table"
sql
="SELECT * FROM test_table"
/>
<
table
name
="user_table"
/>
</
export
>
</
dbunit
>
</
target
>
疑问,看到有人说DBUnit在清除数据时,有时不能彻底,原因是分析不出来外键等表之间的约束.因为在试验中采用的数据库里没啥表之间的约束,所以还没有体会到.
DatabaseTestCase类提供了两个方法来控制测试前和测试后的数据库状态:getSetUpOperation() 和 getTearDownOperation().
一种高效的实施方案就是让getSetUpOperation()方法执行REFRESH操作,通过这个操作,我们可以用种子文件中的数据去更新目标数据库里的数据。
接下来,就是getTearDownOperation(),让他去执行一个NONE操作,也就是什么也不执行
常用操作:
DatabaseOperation.CLEAN_INSERT; 先删除表中所有,再插入准备的数据
DatabaseOperation.REFRESH; 使用准备数据更新表,存在则update,不存在则insert
DatabaseOperation.DELETE; 只删除准备的数据
DatabaseOperation.NONE; 啥都不做
前提:testlink已经跟mantis安装在同一个环境下
步骤:
参照http://crystaliris.bokee.com/5588155.html,testlink网站也给出了比较清楚的文档说明。
1.修改testlink关于interface的配置为"MANTIS",如果用别的BTS(Bug Trace System),有其他的对应值。
2.修改testlink目录下cfg/mantis.cfg.php(如果用别的BTS,修改其他对应目录下的配置),配置一些关于mantis的数据库和url属性。
3.修改mantis的配置文件,打开匿名登录,由于匿名登录的用户名需要是一个已经存在的真实用户,而我又没在mantis上创建新的用户,所以就填写成administrator了。
测试RMI接口实现修改后,jar包用不用重新打
可以的,接口实现修改了,只要接口定义不变,RMIClient调用后,都会按照Server端最新的实现来得到结果.
在class文件的根目录下(例如bin目录)执行rmic命令,写完整接口实现的包名。
环境:windows
下载scarab-1.0-b20.zip,直接解压即可.
需要JDK,Ant(或者maven,scarab推荐maven),DB(推荐MySQL)
在解压后的\scarab-1.0-b20目录中,创建build.properties,以指定数据库连接的参数.
例如:
scarab.database.type=mysql
scarab.database.name=scarab
scarab.database.jdbc.driver=org.gjt.mm.mysql.Driver
scarab.database.host=localhost
scarab.database.port=3306
scarab.database.username=root
scarab.database.password=root
scarab.database.admin.username=${scarab.database.username}
scarab.database.admin.password=${scarab.database.password}
#发送邮件的邮件服务器也可以写在这里
system.mail.host=smtp.126.com
数据库方面,本来想使用postgreSQL,结果发现对于scarab来说配置比较特殊,于是就装了MySQL[见MySQL的那篇文吧].
数据库配置写好以后,进入\scarab-1.0-b20\build\目录,运行ant,就对scarab进行构建啦,能够看到BUILD SUCCESSFULLY就成功啦!!
感觉scarab可以配置的地方很多很多,不过配置修改后还是需要重新build的.之前遇到过的错误就是在写好数据库配置后没有重新build造成的.
构建成功后,就可以使用啦: 进入\scarab-1.0-b20\tomcat\bin目录,运行startup.bat,tomcat就启动起来了,访问http://localhost:8080/scarab/就可以啦。
因为很多功能都需要发邮件来协助,所以要使用SMTP服务器,比方说smtp.126.com,user=realuser,password=realuserpassword
总得来说,觉得scarab界面不是很友好,也不是很美观。
由于一开始邮件服务器不能用,所以直接到数据库中update用户的状态为CONFIRMED。这样子成功登录后,点击“申请新角色”时,竟然抛出错误了,不知道是什么原因,无法继续了,挺郁闷的。
C-JDBC(Java 数据库连接群集)作为开发源码的数据库群集中间件,可以让任何应用程序通过JDBC能够透明的访问数据库群集。数据库可以分布在多个节点并可以进行数据复制,C-JDBC能够均衡在这些节点之间的查询负载。 C-JDBC通过软件来实现RAIDb(廉价数据库冗余阵列)。C-JDBC是GNU LGPL许可证下的ObjectWeb项目。
http://c-jdbc.objectweb.org/网站上的C-JDBC-Brochure-EN.pdf写的内容挺好。(C-JDBC)tutorial.pdf内容也挺翔实。
大型应用随着用户量访问越来越大,增加数据库存储和做好数据库冗余可以增加系统的可靠性和性能。
无需修改客户端应用程序,无需变更应用服务器或数据库服务器软件。C-JDBC的JDBC driver把SQL请求转给C-JDBC controller(负责在databases之间做负载均衡)
The database is distributed and replicated among several nodes and C-JDBC load balances the queries between these nodes.
就这一句话就太诱人了!
上周的某一个上午,搞定C-JDBC的安装配置啦~
主要根据官方的user guide和这篇好文: http://huaronghu.spaces.live.com/blog/cns!B9A68E1C1CA857AD!288.entry
准备工作:
环境:windows,postgreSQL,JDK
建立数据库“们”,安装若干db在若干server上,所以如果使用商业数据库的话,就会需要好几套的钱哪。
安装C-JDBC:
下载了binary版的c-jdbc-2.0.2-bin.zip,解压到作为C-JDBC server的机器上(e.g. C:\software\c-jdbc-2.0.2-bin),
设置环境变量,新增系统变量:CJDBC_HOME =C:\software\c-jdbc-2.0.2-bin
把实际使用的数据库的JDBC driver(例如mysql-connector-java-3.1.12-bin.jar ,postgresql-8.0.309.jdbc2.jar)拷贝到c-jdbc/drivers 中
配置文件:
在c-jdbc-2.0.2-bin/config/virtualdatabase目录中创建虚拟数据库配置文件。
里面DatabaseBackend 标签中定义的就是被集群的数据库。
试验时,创建了文件:postgresql-raidb1-distribution.xml,使用了2个postgreSQL数据库,采用了全复制的方法。
注意,如果采用全复制,所以在2个数据库上建库、建表的全部脚本都要完全相同,否则将会报出mismatch的错误。
目前感觉配置里面最有用的配置就是<AuthenticationManager>,<DatabaseBackend>和<LoadBalancer>(还没有仔细看)。
配置时可以参考已经提供的例子,c-jdbc-2.0.2-bin/config/RAIDb-1-full-example.xml,里面对每一个属性都有比较详细的注释,DatabaseBackend中还有各个开源数据库连接的例子,挺贴心的。
<?
xml version="1.0" encoding="UTF8"
?>
<!
DOCTYPE C-JDBC PUBLIC "-//ObjectWeb//DTD C-JDBC 2.0.2//EN" "http://c-jdbc.objectweb.org/dtds/c-jdbc-2.0.2.dtd"
>
<
C-JDBC
>
<
VirtualDatabase
name
="myDB"
maxNbOfConnections
="20"
minNbOfThreads
="1"
maxNbOfThreads
="20"
blobEncodingMethod
="hexa"
>
<
AuthenticationManager
>
<
Admin
>
<
User
username
="admin"
password
="c-jdbc"
/>
</
Admin
>
<
VirtualUsers
>
<
VirtualLogin
vLogin
="boss"
vPassword
="boss"
/>
</
VirtualUsers
>
</
AuthenticationManager
>
<
DatabaseBackend
name
="postgreSQLNode114"
driver
="org.postgresql.Driver"
url
="jdbc:postgresql://10.10.0.114:5432/clusterdb"
connectionTestStatement
="select now()"
>
<
DatabaseSchema
dynamicPrecision
="column"
/>
<
ConnectionManager
vLogin
="boss"
rLogin
="postgres9"
rPassword
="12345"
>
<
RandomWaitPoolConnectionManager
poolSize
="20"
/>
</
ConnectionManager
>
</
DatabaseBackend
>
<
DatabaseBackend
name
="postgreSQLNode155"
driver
="org.postgresql.Driver"
url
="jdbc:postgresql://10.10.0.155:5432/clusterdb"
connectionTestStatement
="select now()"
>
<
DatabaseSchema
dynamicPrecision
="column"
/>
<
ConnectionManager
vLogin
="boss"
rLogin
="postgres"
rPassword
="abcde"
>
<
RandomWaitPoolConnectionManager
poolSize
="20"
/>
</
ConnectionManager
>
</
DatabaseBackend
>
<
RequestManager
>
<
RequestScheduler
>
<
RAIDb-1Scheduler
level
="passThrough"
/>
</
RequestScheduler
>
<
RequestCache
>
<
MetadataCache
maxNbOfMetadata
="10000"
maxNbOfField
="0"
/>
<
ParsingCache
backgroundParsing
="false"
maxNbOfEntries
="5000"
/>
<
ResultCache
granularity
="table"
maxNbOfEntries
="100000"
pendingTimeout
="0"
>
<
ResultCacheRule
queryPattern
="default"
timestampResolution
="1000"
>
<
EagerCaching
/>
</
ResultCacheRule
>
</
ResultCache
>
</
RequestCache
>
<
LoadBalancer
>
<
RAIDb-1
>
<
RAIDb-1-LeastPendingRequestsFirst
/>
</
RAIDb-1
>
</
LoadBalancer
>
</
RequestManager
>
</
VirtualDatabase
>
</
C-JDBC
>
在c-jdbc-2.0.2-bin/config/controller目录中创建一个c-jdbc controller的配置文件。
试验时,创建的配置文件为:uud-controller-distributed.xml
<?
xml version="1.0" encoding="UTF8"
?>
<!
DOCTYPE C-JDBC-CONTROLLER PUBLIC "-//ObjectWeb//DTD C-JDBC-CONTROLLER 2.0.2//EN" "http://c-jdbc.objectweb.org/dtds/c-jdbc-controller-2.0.2.dtd"
>
<
C-JDBC-CONTROLLER
>
<
Controller
port
="25322"
>
<
Report
/>
<
JmxSettings
>
<
RmiJmxAdaptor
port
="1091"
/>
</
JmxSettings
>
<
VirtualDatabase
configFile
="postgresql-raidb1-distribution.xml"
virtualDatabaseName
="myDB"
autoEnableBackends
="true"
checkpointName
="Initial_empty_recovery_log"
/>
</
Controller
>
</
C-JDBC-CONTROLLER
>
注意:Controller和VirtualMachine的配置文件不能采用相同的文件名
启动:
在c-jdbc-2.0.2-bin\bin目录下,运行controller.bat -f ../config/controller/uud-controller-distributed.xml
unix用户使用controller.sh来启动controller
截图:(下回补)
凑合看一下吧,控制台的正常输出:
C:\software\c-jdbc-2.0.2-bin\bin>controller.bat -f ../config/controller/uud-cont
roller-distributed.xml
2007-03-07 15:16:44,017 INFO controller.core.Controller C-JDBC controller (2.0.
2)
2007-03-07 15:16:44,439 INFO controller.core.Controller Loading configuration f
ile: ../config/controller/uud-controller-distributed.xml
2007-03-07 15:16:44,752 INFO controller.core.Controller JMX is enabled
2007-03-07 15:16:44,830 INFO controller.core.Controller Starting JMX server on
host: 10.10.0.155
2007-03-07 15:16:46,376 INFO backend.DatabaseBackend.postgreSQLNode114 Adding c
onnection manager for virtual user "boss"
2007-03-07 15:16:46,501 INFO backend.DatabaseBackend.postgreSQLNode155 Adding c
onnection manager for virtual user "boss"
2007-03-07 15:16:46,642 INFO controller.RequestManager.myDB Request manager wil
l parse requests with the following granularity: TABLE
2007-03-07 15:16:46,657 WARN controller.virtualdatabase.myDB No recovery log ha
s been configured, enabling backend without checkpoint.
2007-03-07 15:16:48,641 INFO backend.DatabaseBackend.postgreSQLNode114 Detected
backend as: PostgreSQL
2007-03-07 15:16:49,063 WARN backend.DatabaseBackend.postgreSQLNode114 Statemen
t.getGeneratedKeys not supported.
2007-03-07 15:16:49,579 INFO backend.DatabaseBackend.postgreSQLNode114 Gatherin
g database schema
2007-03-07 15:16:49,782 INFO controller.RequestManager.myDB Setting new virtual
database schema.
2007-03-07 15:16:49,782 INFO cjdbc.controller.cache Setting new database schema
.
2007-03-07 15:16:49,782 INFO controller.loadbalancer.RAIDb1 Adding blocking tas
k worker thread for backend postgreSQLNode114
2007-03-07 15:16:49,797 INFO controller.loadbalancer.RAIDb1 Adding non blocking
task worker thread for backend postgreSQLNode114
2007-03-07 15:16:49,797 INFO controller.RequestManager.myDB Database backend po
stgreSQLNode114 is now enabled
2007-03-07 15:16:50,922 INFO backend.DatabaseBackend.postgreSQLNode155 Detected
backend as: PostgreSQL
2007-03-07 15:16:51,328 WARN backend.DatabaseBackend.postgreSQLNode155 Statemen
t.getGeneratedKeys not supported.
2007-03-07 15:16:52,172 INFO backend.DatabaseBackend.postgreSQLNode155 Gatherin
g database schema
2007-03-07 15:16:52,390 INFO controller.RequestManager.myDB Virtual database sc
hema merged with new schema.
2007-03-07 15:16:52,390 INFO cjdbc.controller.cache Merging new database schema
2007-03-07 15:16:52,390 INFO controller.loadbalancer.RAIDb1 Adding blocking tas
k worker thread for backend postgreSQLNode155
2007-03-07 15:16:52,390 INFO controller.loadbalancer.RAIDb1 Adding non blocking
task worker thread for backend postgreSQLNode155
2007-03-07 15:16:52,406 INFO controller.RequestManager.myDB Database backend po
stgreSQLNode155 is now enabled
2007-03-07 15:16:52,422 WARN VirtualDatabaseWorkerThread.myDB.metadata Metadata
key [getMaxColumnsInIndex] is not compatible. (Backends are: [jdbc:postgresql:/
/10.10.0.114:5432/clusterdb] and [jdbc:postgresql://10.10.0.155:5432/clu
sterdb] ; Values are:[32] and [0])
2007-03-07 15:16:52,422 INFO controller.core.Controller Adding VirtualDatabase
myDB
2007-03-07 15:16:52,437 INFO controller.core.Controller Waiting for connections
on 0.0.0.0:25322
2007-03-07 15:16:52,469 INFO controller.core.Controller Controller started on 2
007.03.07 10 at 03:16:52 下午 GMT+08:00
2007-03-07 15:16:52,484 INFO controller.core.Controller Controller 10.10.0.
155:25322 ready, listening to requests ...
遇到过的问题:
1、
刚启动没一会儿,就看到config文件读取错误,控制台信息也就此结束。
解决方法:controller.bat -f filename中filename的相对路径和文件名竟然都写错了,汗。。。。
2、
启动时,控制台抛出ERROR以及exception,大意是connection failed, IP没有配置到pg_hba.conf中
解决方法:虽然是连本机的一个数据库,但是由于数据库连接的url里面写的是IP地址,所以仍然要把本机的IP地址配置到pg_hba.conf以允许其访问。
3、
还是启动时抛错了,Connection test failed(org.postgresql.util.PSQLException:Backend start-up failed:FATAL:role "boss_user" does not exist.)
解决方法:原来是在自己写的.xml配置文件中,DatabaseBackend标签里面写的用户名和密码需要是真实数据库的真实用户名和密码。
最后都整好了,但是遇到一个warn的log:
backend.DatabaseBackend.postgreSQLNode155 Statement.getGeneratedKeys not supported
至今不知道是什么问题,有什么影响.
代码部分:
只需要修改应用程序用到的jdbc driver的配置,把c-jdbc/drivers/目录下的c-jdbc-driver.jar拷贝到应用程序的工程里,并加入到class-path中。
之前是使用 Class.forName("com.somevendor.jdbcDriver.Driver") 去连接某特定的数据库
现在是使用 Class.forName("org.objectweb.cjdbc.driver.Driver") 统一处理。
连接字符串:DriverManager.getConnection("jdbc:cjdbc://localhost:25322/mycjdbc") 取得数据库连接。
c-jdbc server称为c-jdbc controller,聆听请求们
其他所有通过c-jdbc来访问的DB们称为db backends.
jdbc:cjdbc://host1:port1,host2:port2/database
host是指跑着c-jdbc controller的机器IP,port是指controller监听客户端链接的端口,默认端口号:25322
注意,不仅真正的DB安装多个在多个机器上,c-jdbc controller也可以安在不同的机器上,这样可以防止一个c-jdbc 坏掉带来的风险。
例如:
Class.forName(
"
org.objectweb.cjdbc.driver.Driver
"
);
DriverManager.getConnection(
"
jdbc:cjdbc://c1.objectweb.org,c2.objectweb.org/tpcw
"
);
//
不验证用户名密码
DriverManager.getConnection(
"
jdbc:cjdbc://host/db?user=me&password=secret
"
)
//
验证用户名密码的写法1
DriverManager.getConnection(
"
jdbc:cjdbc://host/db;user=me;password=secret
"
)
//
验证用户名密码的写法2
然后可以在代码中insert/update几个记录,再单独到各个数据库中去查一下,应该都受到影响就对了。
问题:
1、管理C-JDBC,不知道C-JDBC需要啥管理,不过好像是已經有一個簡單的 Desktop Application 可以控制相關的 administration 介面, 最重要的是, 他結合了 JMX , 可以讓整個監控的環境更完整.. (等待尝试)
2、不知道通过C-JDBC来操作速度如何
3、RAIdb的3种类型,采取哪个更好?把表分开在不同server上对联表查应该不会有影响吧?
其他:
1、Configuring C-JDBC with Jakarta Tomcat
Copy the c-jdbc-driver.jar file to the lib directory of your web application (for example: $TOMCAT_HOME/webapps/mywebapp/WEB-INF/lib).
There are many ways to obtain connections from a Tomcat application. Just ensure that you are using org.objectweb.cjdbc.driver.Driver as the driver class name and that the JDBC URL is a C-JDBC URL
2、Configuring C-JDBC with Hibernate
C-JDBC just has to be defined as any JDBC driver in Hibernate, leaving the syntax set to the proper database. Here is a configuration example to use Hibernate with a C-JDBC cluster made of Sybase backends:
## C-JDBC
hibernate.dialect net.sf.hibernate.dialect.SybaseDialect
hibernate.connection.driver_class org.objectweb.cjdbc.driver.Driver
hibernate.connection.username user
hibernate.connection.password pass
hibernate.connection.url jdbc:cjdbc://localhost:25322/test
第一次做J2EE的网站时也遇到了这个“常见问题”。
转自
http://huaronghu.spaces.live.com/default.aspx?_c02_owner=1经常出现的Connection reset by peer: 原因可能是多方面的,不过更常见的原因是:
1:服务器的并发连接数超过了其承载量,服务器会将其中一些连接Down掉;
2:客户关掉了浏览器,而服务器还在给客户端发送数据;
3:浏览器端按了Stop;
4:服务器给客户端响应结果给防火墙拦截了。
一些遇到过的小错误,记录下来,不要绊倒第二次:
trim
trim(),4个字母的方法,一定要记得使用啊,已经碰到过很多次由于没有trim字符串而导致查询匹配失败的事情了。
copy
Ctrl+C,Ctrl+V,引入低级bug的魁首之一吧,当然低级bug表现出来就有可能是匪夷所思的错误情况了。
对齐<>们
有时候读取spring的applicationContext.xml会抛出错误,“well-formed data”什么什么的,一般是.xml文件的内容不符合要求,乱掉了,注意,此时不仅应该检查applicationContext.xml,它里面用到的sql-map-config.xml,以及所以表的sqlMap.xml都应该检查。
对于内容本身包含<>符号的,需要用 <![CDATA[ …… ]]>括起来