来源:蜘蛛抓取(WebSpider)
时间:2014-12-17 03:02
标签:
sqlserver数据源
关于Druid 对 SQL Server 2008数据源配置的问题 - 开源中国社区
当前访客身份:游客 [
当前位置:
你好,想跟你请教个问题:
使用druid进行sql server 2008 数据源配置时异常,在oschina上查找了,好像还没有同学使用sql server 进行数据源配置
&bean id=&druidDataSource& class=&com.alibaba.druid.pool.DruidDataSource& init-method=&init& destroy-method=&close&&
&!-- 基本属性配置 --&
&property name=&url& value=&${datasource.url}&/&
&property name=&username& value=&${datasource.username}&/&
&property name=&password& value=&${datasource.password}&/&
&!-- 配置初始化大小、最小、最大 --&
&property name=&initialSize& value=&10& /&
&property name=&minIdle& value=&5& /&
&property name=&maxActive& value=&20& /&
&!-- 配置获取连接等待超时的时间 --&
&property name=&maxWait& value=&60000& /&
&!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 --&
&property name=&timeBetweenEvictionRunsMillis& value=&60000& /&
&!-- 配置一个连接在池中最小生存的时间,单位是毫秒 --&
&property name=&minEvictableIdleTimeMillis& value=&300000& /&
&property name=&validationQuery& value=&SELECT 'x'& /&
&property name=&testWhileIdle& value=&true& /&
&property name=&testOnBorrow& value=&false& /&
&property name=&testOnReturn& value=&false& /&
&!-- 打开PSCache,并且指定每个连接上PSCache的大小
&property name=&poolPreparedStatements& value=&false& /&
&property name=&maxPoolPreparedStatementPerConnectionSize& value=&20& /&
&!-- 配置监控统计拦截的filters --&
&property name=&filters& value=&stat,wall& /&
&!-- 合并sql --&
&property name=&proxyFilters&&
&ref bean=&stat-filter&/&
&/property&
抛出错误信息如下:
SEVERE: Context initialization failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'druidDataSource' defined in URL [file:/D:/tomcat/webapps/ZDHKProject/WEB-INF/classes/applicationContext.xml]: Invocation o nested exception is java.lang.IllegalStateException: dbType not support : null, url jdbc:sqlserver://localhost:1433;databaseName=zkdb
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1455)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:609)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:918)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:469)
at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:383)
at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:283)
at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:111)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4939)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5434)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:901)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:633)
at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1113)
at org.apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig.java:1671)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
at java.util.concurrent.FutureTask.run(FutureTask.java:166)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:724)
Caused by: java.lang.IllegalStateException: dbType not support : null, url jdbc:sqlserver://localhost:1433;databaseName=zkdb
at com.alibaba.druid.wall.WallFilter.init(WallFilter.java:130)
at com.alibaba.druid.pool.DruidDataSource.init(DruidDataSource.java:511)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeCustomInitMethod(AbstractAutowireCapableBeanFactory.java:1581)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1522)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1452)
... 26 more
共有5个答案
<span class="a_vote_num" id="a_vote_num_
这是是因为WallFilter识别不到你这个是sqlserver引起的,配置中加入:
&property name=&dbType& value = &sqlserver& /&
--- 共有 1 条评论 ---
非常感谢,问题已解决。
(3年前) &
<span class="a_vote_num" id="a_vote_num_
用过且没有问题,看样子,url错误了,参考下面的 ,另外jar用sqljdbc4,还有删除安全文件,不然会出问题编译过去,有问题留言:
##################################
# MS SQL Server 2000 (Microsoft) #
com.microsoft.jdbc.sqlserver.SQLServerDriver
##################################
jdbc.driverClassName=com.microsoft.sqlserver.jdbc.SQLServerDriver
jdbc.url=jdbc:sqlserver://XXXXX:1433;database=XXXX
jdbc.username=XXX
jdbc.password=XXXX
<span class="a_vote_num" id="a_vote_num_
& 你看我这dbcp配置运行没有任何问题,换乘druid就抛错
--- 共有 2 条评论 ---
配置了,驱动也是sqljdb4.jar,还是不行,一直提示dbType为空
(3年前) &
建议你重新在配置中设置driverClass ,另外驱动用sqljdbc4,这样应该就可以了
(3年前) &
<span class="a_vote_num" id="a_vote_num_
升级新版本:druid-0.2.26,同时配置中制定driverLcassName
<span class="a_vote_num" id="a_vote_num_
你好,我配置了driverClassName 如下图
任然抛出异常,然后我跟了程序发现是在jdbcUtil中的方法
解析的时候匹配和我配置的url不同,我配置的url如下,
jdbc:sqlserver://localhost:1433;databaseName=zkdb &开头是&
jdbc:sqlserver&,而不是&
jdbc:microsoft:&
更多开发者职位上
有什么技术问题吗?
vainly...的其它问题
类似的话题ODBC管理器设置SQL&server2005数据源(自创)
Database Connectivity,开放数据库互连),一个基于ODBC的对数据库的操作不依赖任何DBMS,不直接与DBMS打交道,所有的数据库操作由对应的DBMS的完成。
一个完整的ODBC由下列几个部件组成:
应用程序(Application)、&驱动程序、驱动程序管理器、数据源;
应用程序:执行处理并调用ODBC
驱动程序:处理ODBC函数调用;
驱动程序管理器:对各个驱动程序进行集中管理;
数据源定义的是连接到实际数据库的一条路径而已,数据源中并无真正的数据,它仅仅记录的是你连接到哪个数据库,以及如何连接的,如odbc数据源。也就是
说数据源仅仅是数据库的连接名称,一个数据库可以有多个数据源连接。
2.ODBC 数据源
使用ODBC数据源连接SQL server数据库。
运行程序之前,首先要附加SQL
server数据库和配置ODBC数据源。
配置方法:
1、“控制面板”下“管理工具”中的“数据源(ODBC)”打开,
选“系统DSN”:——这个地方要区别用户DSN
2、点“添加”按钮,在驱动程序列表中选“SQL
Server”,然后点“完成”:
3、给数据源起个名,这里是ZGY2003_DB_1,在“服务器”下拉列表中选择要做为数据源的服务器,或者直接输入数据库服务器的IP地址:——这个地方注意,如果是用户DSN----可以选local
或是该计算机名称
“名称”:在ASP程序中使用的系统数据源名称。
“说明”:这是为这个系统数据源名称所加注的说明文字。
&&服务器”:希望连接的SQL
Server名称。上图中,共有两种选项;“(Local)”代表用户当前计算机上的SQL
Server数据库系统,其他部分则代表在网络上可以提供连接的数据库系统主机名称
4、根据数据库服务器的登录验证方式(Windows验证、SQL
Server验证)做适当选择,如果是SQL Server验证,输入用户名和密码:
“使用网络登录ID的Windows NT验证”:以当前登录Windows
NT的帐号登录到数据库系统
“使用用户输入的登录ID和密码的SQL Server验证”:使用SQL Server内建的帐号登录
用户DSN可以不计:——这里还需要注意的是“客户端配置”:
如果数据库服务器的TCP/IP协议属性中,IP地址的TCP动态端口选项设置了启用动态端口,那么这里就如同上图设置,如果未启用,则需要输入端口号。端口号的查看办法如下图,在SQL
Server Configuration Manager中的网络配置中的TCP/IP属性中查看:
5、接下来点下一步,更改数据库: 选择您想要连接的数据库。其余的按
6、最后点完成:
会弹出一个窗口,可以测试连接:
显示“测试成功!”通过就大功告成啦!
最后成功图,我们的新建的数据源列在了列表中:
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
您的访问请求被拒绝 403 Forbidden - ITeye技术社区
您的访问请求被拒绝
亲爱的会员,您的IP地址所在网段被ITeye拒绝服务,这可能是以下两种情况导致:
一、您所在的网段内有网络爬虫大量抓取ITeye网页,为保证其他人流畅的访问ITeye,该网段被ITeye拒绝
二、您通过某个代理服务器访问ITeye网站,该代理服务器被网络爬虫利用,大量抓取ITeye网页
请您点击按钮解除封锁&22569人阅读
java程序很大一部分要操作数据库,为了提高性能操作数据库的时候,有不得不使用数据库连接池。数据库连接池有很多选择,c3p、dhcp、proxool等,druid作为一名后起之秀,凭借其出色的性能,也逐渐印入了大家的眼帘。接下来本教程就说一下druid的简单使用。
&首先从&下载最新的jar包。如果想使用最新的源码编译,可以从&下载源码,然后使用maven命令行,或者导入到eclipse中进行编译。
和dbcp类似,druid的配置项如下
缺省值
配置这个属性的意义在于,如果存在多个数据源,监控的时候
可以通过名字来区分开来。如果没有配置,将会生成一个名字,
格式是:&DataSource-& + System.identityHashCode(this)
连接数据库的url,不同数据库不一样。例如:
mysql : jdbc:mysql://10.20.153.104:3306/druid2&
oracle : jdbc:oracle:thin:@10.20.149.85:1521:ocnauto
连接数据库的用户名
连接数据库的密码。如果你不希望密码直接写在配置文件中,
可以使用ConfigFilter。详细看这里:
driverClassName
根据url自动识别
这一项可配可不配,如果不配置druid会根据url自动识别dbType,
然后选择相应的driverClassName
initialSize
初始化时建立物理连接的个数。初始化发生在显示调用init方法,
或者第一次getConnection时
最大连接池数量
已经不再使用,配置了也没效果
最小连接池数量
获取连接时最大等待时间,单位毫秒。配置了maxWait之后,
缺省启用公平锁,并发效率会有所下降,
如果需要可以通过配置useUnfairLock属性为true使用非公平锁。
poolPreparedStatements
是否缓存preparedStatement,也就是PSCache。
PSCache对支持游标的数据库性能提升巨大,比如说oracle。
在mysql5.5以下的版本中没有PSCache功能,建议关闭掉。
作者在5.5版本中使用PSCache,通过监控界面发现PSCache有缓存命中率记录,
该应该是支持PSCache。
maxOpenPreparedStatements
要启用PSCache,必须配置大于0,当大于0时,
poolPreparedStatements自动触发修改为true。
在Druid中,不会存在Oracle下PSCache占用内存过多的问题,
可以把这个数值配置大一些,比如说100
validationQuery
用来检测连接是否有效的sql,要求是一个查询语句。
如果validationQuery为null,testOnBorrow、testOnReturn、
testWhileIdle都不会其作用。
testOnBorrow
申请连接时执行validationQuery检测连接是否有效,
做了这个配置会降低性能。
testOnReturn
归还连接时执行validationQuery检测连接是否有效,
做了这个配置会降低性能
testWhileIdle
建议配置为true,不影响性能,并且保证安全性。
申请连接的时候检测,如果空闲时间大于
timeBetweenEvictionRunsMillis,
执行validationQuery检测连接是否有效。
timeBetweenEvictionRunsMillis
有两个含义:
1) Destroy线程会检测连接的间隔时间
&2) testWhileIdle的判断依据,详细看testWhileIdle属性的说明
numTestsPerEvictionRun
不再使用,一个DruidDataSource只支持一个EvictionRun
minEvictableIdleTimeMillis
connectionInitSqls
物理连接初始化的时候执行的sql
exceptionSorter
根据dbType自动识别
当数据库抛出一些不可恢复的异常时,抛弃连接
属性类型是字符串,通过别名的方式配置扩展插件,
常用的插件有:
监控统计用的filter:stat&
日志用的filter:log4j
&防御sql注入的filter:wall
proxyFilters
类型是List&com.alibaba.druid.filter.Filter&,
如果同时配置了filters和proxyFilters,
是组合关系,并非替换关系
表1.1 配置属性
根据常用的配置属性,首先给出一个如下的配置文件,放置于src目录下。
配置文件1.1&
配置项中指定了各个参数后,在连接池内部是这么使用这些参数的。数据库连接池在初始化的时候会创建initialSize个连接,当有数据库操作时,会从池中取出一个连接。如果当前池中正在使用的连接数等于maxActive,则会等待一段时间,等待其他操作释放掉某一个连接,如果这个等待时间超过了maxWait,则会报错;如果当前正在使用的连接数没有达到,则判断当前是否空闲连接,如果有则直接使用空闲连接,如果没有则新建立一个连接。在连接使用完毕后,不是将其物理连接关闭,而是将其放入池中等待其他操作复用。
同时连接池内部有机制判断,如果当前的总的连接数少于miniIdle,则会建立新的空闲连接,以保证连接数得到miniIdle。如果当前连接池中某个连接在空闲了timeBetweenEvictionRunsMillis时间后任然没有使用,则被物理性的关闭掉。有些数据库连接的时候有超时限制(mysql连接在8小时后断开),或者由于网络中断等原因,连接池的连接会出现失效的情况,这时候设置一个testWhileIdle参数为true,可以保证连接池内部定时检测连接的可用性,不可用的连接会被抛弃或者重建,最大情况的保证从连接池中得到的Connection对象是可用的。当然,为了保证绝对的可用性,你也可以使用testOnBorrow为true(即在获取Connection对象时检测其可用性),不过这样会影响性能。
2 代码编写
2.1 使用spring
首先给出spring配置文件
配置文件2.1
其中第一个bean中给出的配置文件/WEB-INF/classes/dbconfig.properties就是第1节中给出的配置文件。我这里还特地给出dbcp的spring配置项,目的就是将两者进行对比,方便大家进行迁移。这里没有使用JdbcTemplate,所以jdbc那个bean没有使用到。下面给出com.whyun.druid.model.TableOperator类的代码。
代码片段2.1
注意:在使用的时候,通过获取完Connection对象,在使用完之后,要将其close掉,这样其实是将用完的连接放入到连接池中,如果你不close的话,会造成连接泄露。
然后我们写一个servlet来测试他.
代码片段2.2
这里没有用到struts2或者springmvc,虽然大部分开发者用的是这两种框架。
2.2 不使用spring
类似于dbcp,druid也提供了原生态的支持。这里仅仅列出来了如何获取一个DataSource对象,实际使用中要将获取DataSource的过程封装到一个单体模式类中。先看下面这段代码:
代码片段2.3 手动读取配置文件初始化连接池
第37行中调用了类com.alibaba.druid.pool.DruidDataSourceFactory中createDataSource方法来初始化一个连接池。对比dbcp的使用方法,两者很相似。
下面给出一个多线程的测试程序。运行后可以比较druid和dbcp的性能差别。
代码片段2.4 连接池多线程测试程序
3.1 web监控
druid提供了sql语句查询时间等信息的监控功能。为了让数据库查询一直运行,下面特地写了一个ajax进行轮询。同时,还要保证在web.xml中配置如下信息
配置文件3.1 在web.xml中添加druid监控
同时将ajax代码提供如下
[javascript]&
代码片段3.1 ajax轮询
这时打开http://localhost/druid-web/druid/ 地址,会看到监控界面,点击其中的sql标签。
图3.1 监控界面查看sql查询时间
注意:在写配置文件1.1时,要保证filter配置项中含有stat属性,否则这个地方看不到sql语句的监控数据。
表格中各项含义如下
ExecuteCount
当前已执行次数
当前已执行时间
当前最大执行时间
当前运行的事务数量
当前执行出错的数目
当前更新或者删除操作中已经影响的行数
当前sql操作中已经读取的行数
当前sql正在运行的数目
Concurrent
当前sql最大并发执行数&
ExecHisto&
当前sql做execute操作的时间分布数组
分为0-1,1-10,10-100,100-1000,,个时间分布区域,单位为
ExecRsHisto&
当前sql做execute操作和resultSet
打开至关闭的时间总和分布数组
FetchRowHisto
当前sql查询时间分布数组
UpdateHisto&
当前sql更新、删除时间分布数组
表3.1 监控字段含义
老版本的druid的jar包中不支持通过web界面进行远程监控,从0.2.14开始可以通过配置jmx地址来获取远程运行druid的服务器的监控信息。具体配置方法如下:
配置文件3.2 远程监控web
这里连接的配置参数中多了一个jmxUrl,里面配置一个jmx连接地址,如果配置了这个init-param后,那么当前web监控界面监控的就不是本机的druid的使用情况,而是jmxUrl中指定的ip的远程机器的druid使用情况。jmx连接中也可以指定用户名、密码,在上面的servlet中添加两个init-param,其param-name分别为jmxUsername和jmxPassword,分别对应连接jmx的用户名和密码。对于jmx在服务器端的配置,可以参考3.2节中的介绍。
3.2 jconsole监控
同时druid提供了jconsole监控的功能,因为界面做的不是很好,所以官方中没有对其的相关介绍。如果是纯java程序的话,可以简单的使用jconsole,也可以使用3.1中提到的通过配置init-param来访问远程druid。下面依然使用的是刚才用的web项目来模拟druid所在的远程机器。
现在假设有两台机器,一台是运行druid的A机器,一台是要查看druid运行信息的B机器。
首先在这台远程机器A的catalina.bat(或者catalina.sh)中加入java的启动选项,放置于if &%OS%& == &Windows_NT& setlocal这句之后。
set JAVA_OPTS=%JAVA_OPTS% -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=&9004& -Dcom.sun.management.jmxremote.authenticate=&false& -Dcom.sun.management.jmxremote.ssl=&false&
保存完之后,启动startup.bat(或者startup.sh)来运行tomcat(上面设置java启动项的配置,按理来说在eclipse中也能适用,但是笔者在其下没有试验成功)。然后在要查看监控信息的某台电脑B的命令行中运行如下命令
jconsole -pluginpath E:\kuaipan\workspace6\druid-web\WebRoot\WEB-INF\lib\druid-0.2.11.jar
这里的最后一个参数就是你的druid的jar包的路径。
图3.2 jconsole连接界面
在远程进程的输入框里面输入ip:端口号,然后点击连接(上面的配置中没有指定用户名、密码,所以这里不用填写)。打开的界面如下:
图3.3 jconsole 连接成功界面
可以看到和web监控界面类似的数据了。推荐直接使用web界面配置jmx地址方式来访问远程机器的druid使用情况,因为这种方式查看到的数据信息更全面些。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:143676次
排名:千里之外
转载:77篇
(1)(1)(1)(3)(7)(2)(3)(12)(1)(6)(21)(30)(1)(1)(1)(2)