proxool连接池由于其比较强的监控功能,如sql语句执行时间统计、sql语句抓取等颇受部分人群的欢迎,基于此最近一个项目也使用了proxool连接池。Proxool管理功能只要在web.xml文件中配置Proxool的AdminServlet即可,如下所示:
<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语句的时候,却抛出CharConversionException:java.io.CharConversionException: Not an ISO 8859-1 character: 中。纵观所有可以查看的sql语句都不包含中文,因此估计是servelt输出中文导致。
原因分析:
Proxool的AdminServlet的所有响应都是执行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,然后重写AdminServeltEX的doGet方法即可。
在AdminServeltEX的doGet方法中,我们可以用printwriter进行输出,或者保留response.getOutputStream()的输出,但是将输出信息全部进行iso编码。
修改web.xml配置,将proxool管理servlet的servlet-class替换成AdminServeltEX即可。