vickzhu

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  151 随笔 :: 0 文章 :: 34 评论 :: 0 Trackbacks

#

posted @ 2009-03-12 10:37 筱 筱 阅读(186) | 评论 (0)编辑 收藏

Hibernate支持第三方的连接池,官方推荐的连接池是C3P0,Proxool,以及DBCP。在配置连接池时需要注意的有三点:
  一、Apche的DBCP在Hibernate2中受支持,但在Hibernate3中已经不再推荐使用,官方的解释是这个连接池存在缺陷。如果你因为某种原因需要在Hibernate3中使用DBCP,建议采用JNDI方式。
  二、默认情况下(即没有配置连接池的情况下),Hibernate会采用内建的连接池。但这个连接池性能不佳,且存在诸多BUG,因此官方也只是建议仅在开发环境下使用。
  三、Hibernate2和Hibernate3的命名空间有所变化。例如,配置C3P0时的provider_class有Hibernate2环境下使用net.sf.hibernate.connection.C3P0ConnectionProvider,在Hibernate3环境下使用org.hibernate.connection.C3P0ConnectionProvider。
  下面是Hibernate环境下几种常见的连接池配置,都是以连接MySQl为例。
  <!-- JDBC驱动程序 -->
  <property name="connection.driver_class">org.gjt.mm.mysql.Driver</property>
  <property name="connection.url">jdbc:mysql://localhost:3306/struts?useUnicode=true
  & characterEncoding=GBK</property>
  <!-- 数据库用户名 -->
  <property name="connection.username">root</property>
  <!-- 数据库密码 -->
  <property name="connection.password">8888</property>
  上面的一段配置,在c3p0和dbcp中,都是必需的,因为hibernate会根据上述的配置来生成connections,再交给c3p0或dbcp管理。但是proxool则不能,可以让proxool自身来生成连接,这在下面再讲。
  从网上google了一下,发现大致有三种可以实施的解决方案:
  1、使用hibernate自带的连接池;
  2、使用c3po包的连接池功能;
  3、使用dbcp包的连接池功能;
  4、使用Proxool包的连接池功能;
        5、使用JNDI连接池
  第一种方案,Hibernate默认连接池,就是在myeclipse产生的hibernate.cfg.xml中添加一个属性:
  <property name="connection.pool_size">20</property>
  第二种方案是:C3P0
  只需在hibernate.cfg.xml中加入
  <property name="c3p0.min_size">2</property>
  <property name="c3p0.max_size">10</property>
  <property name="c3p0.timeout">1800</property>
  <property name="c3p0.acquireRetryAttempts">4</property>
  <property name="c3p0.acquireIncrement">1</property>
  <property name="c3p0.idleConnectionTestPeriod">36000</property>
  <property name="c3p0.initialPoolSize">2</property>
  <property name="c3p0.maxPoolSize">10</property>
  <property name="c3p0.maxIdleTime">1200</property>
  <property name="c3p0.maxStatements">30</property>
  <property name="c3p0.minPoolSize">2</property>
  <property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
  还有在classespath中加入c3p0-0.8.4.5.jar
  第三种方案是:dbcp
  在hibernate.cfg.xml中加入
  <property name="dbcp.maxActive">100</property>
  <property name="dbcp.whenExhaustedAction">1</property>
  <property name="dbcp.maxWait">60000</property>
  <property name="dbcp.maxIdle">10</property>
  <property name="dbcp.ps.maxActive">100</property>
  <property name="dbcp.ps.whenExhaustedAction">1</property>
  <property name="dbcp.ps.maxWait">60000</property>
  <property name="dbcp.ps.maxIdle">10</property>
  还有在classespath中加入commons-pool-1.2.jar 和commons-dbcp-1.2.1.jar.
  第四种方案是:Proxool
  建立一个Proxool.xml文件:
  <?xml version="1.0" encoding="UTF-8"?>
  <!-- the proxool configuration can be embedded within your own application’s.
  Anything outside the "proxool" tag is ignored. -->
  <something-else-entirely>
  <proxool>
  <alias>
  mysql
  </alias>
  <driver-url>
  jdbc:mysql://localhost:3306/jackdemo
  </driver-url>
  <driver-class>
  com.mysql.jdbc.Driver
  </driver-class>
  <driver-properties>
  <property name="user" value="root" />
  <property name="password" value="jack" />
  </driver-properties>
  <house-keeping-sleep-time>
  60000
  </house-keeping-sleep-time>
  <proxool.simultaneous-build-throttle>
  100
  </proxool.simultaneous-build-throttle>
  <prototype-count>
  2
  </prototype-count>
  <maximum-connection-count>
  100
  </maximum-connection-count>
  <minimum-connection-count>
  10
  </minimum-connection-count>
  </proxool>
  </something-else-entirely>
  现在来看下配置的意思:
  <alias>配置连接池的别名;
  <driver-url>和写JDBC连接数据库时的URL一样。
  <driver-class>和写JDBC连接数据库时的Driver一样。
  <driver-properies>就是连接数据库时的用户名和密码。
  <house-keeping-sleep-time>proxool自动侦察各个连接状态的时间间隔(毫秒),侦察到空闲的连接就马上回收,超时的销毁
  <prototype-count>最少保持的空闲连接数
  <maximum-connection-count>最大连接数。
  <minimum-connection-count>最小连接数。
  以下是在Hibernate配置文件中对连接池的配置:
  <?xml version=’1.0’ encoding=’UTF-8’?>
  <!DOCTYPE hibernate-configuration PUBLIC
  "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
  "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
  <hibernate-configuration>
  <session-factory>
  <!-- proxool连接池加载的类-->
  <property name="hibernate.connection.provider_class">
  org.hibernate.connection.ProxoolConnectionProvider
  </property>
  <!--连接池的别名,即配置连接池时起的别名-->
  <property name="hibernate.proxool.pool_alias">
  mysql
  </property>
  <!--连接池文件的地址-->
  <property name="hibernate.proxool.xml">
  config/proxool/proxool.xml
  </property>
  <!--是否将运行期生成的SQL输出到日志以供调试-->
  <property name="show_sql">true</property>
  <mapping resource="com/jack/ssh/demo/bo/City.hbm.xml" />
  <mapping resource="com/jack/ssh/demo/bo/Province.hbm.xml" />
  </session-factory>
  </hibernate-configuration>
  第五种方案是:JNDI连接池。数据源已经由应用服务配置好(如Web服务器),Hibernate需要做的只是通过JNDI名查找到此数据源。应用服务器将连接池对外显示为JNDI绑定数据源,它是javax.jdbc.Datasource类的一个实例。只要配置一个Hibernate文件,如:
  hibernate.connection.datasource = java:/comp/env/jdbc/portal //JNDI名
  hibernate.transaction.factory_class = org.hibernate.transaction.JTATransactionFactory
  hibernate.transaction.manager_loopup_class = org.hibernate.transaction.JBossTransactionManagerLookup
  hibernate.dialect = org.hibernate.dialect.MySQLDialect。
posted @ 2009-03-10 09:23 筱 筱 阅读(473) | 评论 (0)编辑 收藏

Name Lession Mark
Amy Chinese 89
Amy Math 59
Amy History 87
Amy Japanese 77
Alan Math 54
Alan Chinese 83
Alan History 86
Alan Japanese 76
Bruce History 83
Bruce Math 58
Bruce Japanese 82
Alisa Math 59


1. 请查询出学生出姓名mark<60
2. 请查询每门学科中存在有一门不及格的学生姓名
3. 请查询出各科总分排行前三名的学生姓名和成绩(包含并列)
4. 请查询出每门科目中前三名的学生姓名和科目(包含并列的)




posted @ 2009-02-25 20:32 筱 筱 阅读(232) | 评论 (0)编辑 收藏

<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" id=scriptmain name=scriptmain codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,29,0" width="560" height="176">
       <param name="movie" value="/images/bcastr.swf?bcastr_xml_url=/pages/web/xml/bcastr.xml" />
       <param name="quality" value="high" />
       <param name=scale value=noscale />
       <param name="LOOP" value="false" />
       <param name="menu" value="false" />
       <param name="wmode" value="transparent" />
       <embed src="/images/bcastr.swf?bcastr_xml_url=/pages/web/xml/bcastr.xml" width="560" height="176" loop="false" quality="high" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" salign="T" name="scriptmain" menu="false" wmode="transparent"></embed>
</object>

<?xml version="1.0" encoding="utf-8"?>
<bcaster autoPlayTime="5">
<item item_url="flash图片" link="链接路径" >
</item>
<item item_url="flash图片" link="链接路径" >
</item>
</bcaster>
posted @ 2009-02-17 09:36 筱 筱 阅读(156) | 评论 (0)编辑 收藏

困扰我多年的sql语句执行顺序今天终于在网上找到了
1. 先where 后select
2. 先where 再group 再having 后select
3. 先where 再group 再having 再order 后select
4. 先join 再where 后select
例:select top 3 name from student group by name order by sum(mark) desc
    (查询班上总分排名前三的学生姓名)
开心啦,开心!
posted @ 2009-02-03 16:31 筱 筱 阅读(258) | 评论 (0)编辑 收藏

1,load()方法从来就是假定数据在数据库中是存在的,在使用时如果不存在则会抛出ObjectNotFoundException;而get()方法不会假定数据在数据库中存在,如果不存在则返回null
2,load()方法返回的是实体类的代理类,因此load()可以使用延迟加载策略来加载对象
      get()方法返回的不一定是实体类,可能是代理类,因为get()方法如果在session缓存(一级缓存)中找到了该id对应的对象,如果刚好该对象前面是被代理过的,如被load方法使用过,或者被其他关联对象延迟加载过,那么返回的还是原先的代理对象,而不是实体类对象。
3,load()方法查询数据时会先从session缓存(一级缓存)中查找,如果没有找到则会创建代理类,该代理类仅仅初始化了OID属性,当第一次访问其他属性值时,则会依次从二级缓存-->数据库查找,直到找到数据,最后将所有属性值赋给代理类。而get()方法则会直接按照一级缓存-->二级缓存-->数据库的顺序查找。

看到网上的全都是复制的,而且错误不少,怎么就没有人修正一下呢?
posted @ 2009-01-22 10:29 筱 筱 阅读(472) | 评论 (0)编辑 收藏

HTTP头中一般断点下载时才用到Range和Content-Range实体头,
Range用户请求头中,指定第一个字节的位置和最后一个字节的位置,如(Range:200-300)
Content-Range用于响应头

请求下载整个文件:
***********************************
GET  /test.rar  HTTP/1.1
Connection:  close
Host:  116.1.219.219
Range:  bytes=0-100
***********************************
Range头域可以请求实体的一个或者多个子范围,Range的值为0表示第一个字节,也就是Range计算字节数是从0开始的
表示头500个字节:bytes=0-499
表示第二个500字节:bytes=500-999
表示最后500个字节:bytes=-500
表示500字节以后的范围:bytes=500-
第一个和最后一个字节:bytes=0-0,-1
同时指定几个范围:bytes=500-600,601-999


一般正常回应
***********************************
HTTP/1.1 206 OK
Content-Length:  801     
Content-Type:  application/octet-stream 
Content-Location: http://www.onlinedown.net/hj_index.htm
Content-Range:  bytes  0-100/2350 //2350:文件总大小
Last-Modified: Mon, 16 Feb 2009 16:10:12 GMT
Accept-Ranges: bytes
ETag: "d67a4bc5190c91:512"
Server: Microsoft-IIS/6.0
Date: Wed, 18 Feb 2009 07:55:26 GMT
***********************************

注意:如果用户的请求中含有range ,则服务器的相应代码为206。
206 - Partial Content 客户发送了一个带有Range头的GET请求,服务器完成了它(HTTP 1.1新)。
posted @ 2009-01-21 17:48 筱 筱 阅读(4353) | 评论 (0)编辑 收藏

        最近我们公司的jsp网站要和另一家公司的asp网站做通讯,之间通过xml传递信息
        现假如我们公司是A,对方公司是B,如果A发送一条信息给B,B必须反馈一条信息表示是否执行成功。这里有两种模式可以使用,
    第一:A、B把对方都当做服务器进行消息发送
    第二:A相当于浏览器、B相当于服务器,A发送一个消息给B,B直接返回给A信息。
    下面我们来看看这两种方式分别怎么实现?
    第一种:
        1、A(a.jsp)的代码:
        StringBuffer sb=new StringBuffer("<?xml version=\"1.0\" encoding=\"GBK\"?>");
        sb.append("<User>");
        sb.append("<HEAD>");
        sb.append("<SUCCESS></SUCCESS>");
        sb.append("</HEAD>");
        sb.append("<BODY>");
        sb.append("<MOBILE></MOBILE>");
        sb.append("<NAME></NAME>");
        sb.append("<SEX></SEX>");
        sb.append("</BODY>");
        sb.append("</User>");
        URL url = new URL("B服务器的接收路径");
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setRequestProperty("Content-Type", "text/xml;charset=gbk");
        conn.setRequestMethod("POST");
        conn.setRequestProperty("Content-Length", String.valueOf(xml.length()));
        conn.setConnectTimeout(5000);
        conn.setDoOutput(true);
        OutputStream os = conn.getOutputStream();
        os.write(sb.toString().getBytes());
        os.flush();
        os.close();
        2、B服务器接收到A的请求后,也以类似于1(当然asp中的代码我不知道怎么写)将反馈信息发送到A的指定路径(b.jsp)
        3、A(b.jsp)接收B的反馈信息:
            InputStream is=request.getInputStream();
    第二种:
        1、A(a.jsp)的代码
            StringBuffer sb=new StringBuffer("<?xml version=\"1.0\" encoding=\"GBK\"?>");
            sb.append("<User>");
            sb.append("<HEAD>");
            sb.append("<SUCCESS></SUCCESS>");
            sb.append("</HEAD>");
            sb.append("<BODY>");
            sb.append("<MOBILE></MOBILE>");
            sb.append("<NAME></NAME>");
            sb.append("<SEX></SEX>");
            sb.append("</BODY>");
            sb.append("</User>");
            URL url = new URL("B服务器的接收路径");
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestProperty("Content-Type", "text/xml;charset=gbk");
            conn.setRequestMethod("POST");
            conn.setRequestProperty("Content-Length", String.valueOf(xml.length()));
            conn.setConnectTimeout(5000);
            conn.setDoOutput(true);
            OutputStream os = conn.getOutputStream();
            os.write(sb.toString().getBytes());
            os.flush();
            os.close();
        2、B接收到A(a.jsp)服务器的代码后用
                byte[] byts = new byte[Request.InputStream.Length];
             Request.InputStream.Read(byts,
0,byts.Length);
                
然后用Response.OutputStream.write()返回信息
        3、A(a.jsp)接收B服务器的反馈信息(和1的代码同在a.jsp中,并且就接着1代码的后面)
               if(conn.getResponseCode()==200){
                   String line=null;
                   String body="";
                   is = conn.getInputStream();
                   BufferedReader br = new BufferedReader(new InputStreamReader(is));
                   while ((line = br.readLine()) != null) {
                        body += line;
                   }
                   conn.disconnect();
              }
        其中访问一个页面主要用到了HttpURLConnection这个类,当然还有其它几种方式可以使用,具体请参见我的文章http://www.blogjava.net/vickzhu/archive/2008/11/12/240013.html
posted @ 2009-01-04 14:57 筱 筱 阅读(1039) | 评论 (1)编辑 收藏

错误代码:
org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in read-only mode (FlushMode.NEVER) - turn your Session into FlushMode.AUTO or remove 'readOnly' marker from transaction definition
错误原因:
OpenSessionInViewFilter在getSession的时候,会把获取回来的session的flush mode 设为FlushMode.NEVER。然后把该sessionFactory绑定到TransactionSynchronizationManager,使request的整个过程都使用同一个session,在请求过后再解除该sessionFactory的绑定,最后closeSessionIfNecessary根据该session是否已和transaction绑定来决定是否关闭session。在这个过程中,若HibernateTemplate 发现自当前session有不是readOnly的transaction,就会获取到FlushMode.AUTO Session,使方法拥有写权限。
也即是,如果有不是readOnly的transaction就可以由Flush.NEVER转为Flush.AUTO,拥有insert,update,delete操作权限,如果没有transaction,并且没有另外人为地设flush model的话,则doFilter的整个过程都是Flush.NEVER。所以受transaction保护的方法有写权限,没受保护的则没有。
参考文章:
http://calvin.blog.javascud.org/post/46.htm
解决办法:
采用spring的事务声明,使方法受transaction控制
<bean id="baseTransaction"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
abstract="true">
<property name="transactionManager" ref="transactionManager"/>
<property name="proxyTargetClass" value="true"/>
<property name="transactionAttributes">
<props>
<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="load*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="save*">PROPAGATION_REQUIRED</prop>
<prop key="add*">PROPAGATION_REQUIRED</prop>
<prop key="update*">PROPAGATION_REQUIRED</prop>
<prop key="remove*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
    <bean id="userService" parent="baseTransaction">
<property name="target">
<bean class="com.phopesoft.security.service.impl.UserServiceImpl"/>
</property>
</bean>

posted @ 2008-12-11 11:20 筱 筱 阅读(432) | 评论 (0)编辑 收藏

暂时发现了两种静态页包含静态页的方法
1、<object style="border:0px" type="text/x-scriptlet" data="test.html" width=100% height=1000></object>
2、<iframe src="" frameborder="0"></iframe>
第一种可以解决大部分问题,不过第二种如果你的a页面包含b页面,b页面中的链接都是在b页面本页打开的话,b链接的页面就不会在a主窗体显示
posted @ 2008-11-26 09:49 筱 筱 阅读(324) | 评论 (0)编辑 收藏

仅列出标题
共9页: 上一页 1 2 3 4 5 6 7 8 9 下一页