`
isiqi
  • 浏览: 16165606 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

proxool连接池 CharConversionException原因分析及处理

阅读更多

proxool连接池由于其比较强的监控功能,如sql语句执行时间统计、sql语句抓取等颇受部分人群的欢迎,基于此最近一个项目也使用了proxool连接池。Proxool管理功能只要在web.xml文件中配置ProxoolAdminServlet即可,如下所示:

<servlet>

<servlet-name>ProxoolAdminServlet</servlet-name>

<servlet-class>org.logicalcobwebs.proxool.admin.servlet.

AdminServlet

</servlet-class>

</servlet>

<servlet-mapping>

<servlet-name>ProxoolAdminServlet</servlet-name>

<url-pattern>/ProxoolAdmin</url-pattern>

</servlet-mapping>

则只要我们访问http://{id}:{端口}/{context名称}/ ProxoolAdmin,即可查看连接池信息,如:连接池配置信息,连接池服务次数,正在执行的sql语句,sql语句执行时间等。

但是,在查看有些sql语句的时候,却抛出CharConversionExceptionjava.io.CharConversionException: Not an ISO 8859-1 character: 中。纵观所有可以查看的sql语句都不包含中文,因此估计是servelt输出中文导致。

原因分析:

ProxoolAdminServlet的所有响应都是执行doGet函数,该函数返回的都是response信息,都是通过response.getOutputStream().println输出,因此只要sql语句中包含中文,执行response.getOutputStream().println(“含中文的sql语句”)就一定会报java.io.CharConversionException

解决办法:

由于AdminServlet直接通过response.getOutputStream()print信息,因此设置ContentType或者characterencoding都不能解决此问题,除非更换printwriter来输出或者将输出的内容都转换为iso编码。不管如何,我们都要新建一个Proxool AdminServelt,假设为AdminServeltEX, AdminServeltEX应继承自AdminServelt,然后重写AdminServeltEXdoGet方法即可。

AdminServeltEXdoGet方法中,我们可以用printwriter进行输出,或者保留response.getOutputStream()的输出,但是将输出信息全部进行iso编码。

修改web.xml配置,将proxool管理servletservlet-class替换成AdminServeltEX即可。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics