【MyBatis 二级缓存】

概述:一级缓存作用域为同一个SqlSession对象,而二级缓存用来解决一级缓存不能夸会话共享,作用范围是namespace级,可以被多个SqlSession共享(只要是同一个接口方法的相同方法,都可同享)。

  • MyBatis默认支持一级二级缓存。在没有任何配置情况下,默认开启一级缓存,MyBatis 的一级缓存是在会话(SqlSession)层面进行缓存的;
  • mybatis的二级缓存默认也是开启的,但由于他的作用域是namespace,所以还需要在mapper.xml中开启才能生效;
  • 缓存优先级:通过mybatis发起的查询,作用顺序为:二级缓存->一级缓存->数据库 ,其中一二级缓存不为空将直接返回结果,否则查询数据库;
  • 缓存失效:当在一个缓存作用域中发生了update、insert、delete 操作后,将会触发缓存失效,下一次查询将命中数据库,从而保证不会查到脏数据;
  • MyBatis一级缓存范围是SqlSession内部。二级缓存为namespace,有多个SqlSession或者分布式的环境下,数据库写操作会引起脏数据,建议设定缓存级别为Statement,即进行如下配置

1、【缓存解析说明

有多个SqlSession或者分布式的环境下,数据库写操作会引起脏数据,建议实际开发应用中设定缓存级别为Statement(工程pom文件中)。如下:

 

解释:Executor为顶级接口,SimpleExecutor、BatchExecutor和ReuseExecutor是具体组件实现类,而CachingExecutor是具体的装饰器。具体组件实现类有一个父类BaseExecutor,而这个父类是一个模板模式的典型应用,一级缓存的操作都在这个类中实现,具体的操作数据库的功能子类实现。客户端通过工厂实现调用配置文件最后调用数据读取BaseExecutor中Query方法,首先缓存对象,缓存存在直接从缓存中获得,不存在查询数据后再写入缓存。

(图一):操作缓存业务图

 

 

 (图二):类关系图

 

二级缓存开启步骤

     A、工程配置文件中增加二级缓存配置信息

 B、xxxMapper.xml文件中开启全局二级缓存支持,如果不在某一个Mapper.xml文件中开启cache就不存在二级缓存。

<!-- 声明此namespace开启二级缓存,MyBatis自带的二级缓存 -->
<cache/>

 【配置说明】:

  A、配置后该namespace下所有 select 语句查询结果将会被缓存;

  B、覆盖文件的所有 insert、update 和 delete 语句会刷新缓存;

  C、缓存默认使用最近最少使用算法清除不需要缓存;

  D、缓存默认不配置定时刷新;

  E、缓存默认保存1024个引用;

 【cache可以设置属性,举例说明】

<cache
eviction="FIFO"
flushInterval="60000" 
/* 每隔 60 秒刷新, (刷新间隔)属性可以被设置为任意的正整数,设置的值应该是一个以毫秒为单位的合理时间量。 默认情况是不设置,也就是没有刷新间隔,缓存仅仅会在调用语句时刷新 */
size="2048"           
/* 最多可以存储结果对象或列表的 2048 个引用, ,而且返回的对象被认为是只读因此对它们进行修改可能会在不同线程中的调用者产生冲突 */
readOnly="true"/>
/* readOnly(只读)属性可以被设置为 true 或 false。只读的缓存会给所有调用者返回缓存对象的相同实例。 因此这些对象不能被修改。这就提供了可观的性能提升。而可读写的缓存会(通过序列化)返回缓存对象的拷贝。 速度上会慢一些,但是更安全,因此默认值是 false
*/

[清除策略]:

  LRU :最近最少使用:移除最长时间不被使用的对象;

  FIFO :先进先出:按对象进入缓存的顺序来移除它们;

  SOFT :软引用:基于垃圾回收器状态和软引用规则移除对象;

  WEAK :弱引用:更积极地基于垃圾收集器状态和弱引用规则移除对象;

C、二级缓存必然会引起脏读,实时性较高的操作可单独关闭关闭二级缓存(某一查询禁用二级缓存)

<select id="queryPersonById" parameterType="int" resultType="com.cache.bean.Person" useCache="false"/>

D、清理二级缓存

    二级缓存清理与一级方法相同,使用commit()(执行增、删、改时会执行commit操作,会清理掉缓存,设计这个机制原因是为了防止脏读。注意:二级缓存中commit不能是查询本身的commit);
    在select标签中,增加属性flushCache=”true

E、注意

  1)、二级缓存是事务性的。当 SqlSession 完成commit时或是回滚,但未执行 flushCache=true 的 insert/delete/update 语句时,缓存会获得更新(但不能是同一个SqlSession的查询commit);

  2)、MyBatis在多表查询时,极大可能会出现脏数据,设计上存在缺陷;

  3)、在分布式环境下,由于默认的MyBatis Cache实现都是基于本地的,分布式环境下必然会出现读取到脏数据,需要使用集中式缓存将MyBatis的Cache接口实现,有一定的开发成本。使用Redis、Memcached等分布

       式缓存可能成本更低,安全性也更高(后续博文发布);

   4)、触发二级缓存的时机为session.close时

   5)、XxxMapper.xml文件中的实体类需要做序列化操作,级联类及父类也需要序列化操作;

应用实例:

1、  实体类

public class Person implements Serializable {
    static final long serialVersionUID = 42L;
    /* 人员ID */
    private int id;
    /* 人员名称 */
    private String name;
    /* 人员年龄 */
    private int age;
    /* 人员性别 */
    private Boolean sex;

    public Person() {
    }
    public Person(int id, String name, int age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }
    public Person(int id, String name, int age, Boolean sex) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.sex = sex;
    }
    public Boolean getSex() {
        return sex;
    }
    public void setSex(Boolean sex) {
        this.sex = sex;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "Person{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

2、  接口类

// 操作mybatis接口
public interface PersonMapper {
Person queryPersonById(int id);
}

3、 Mapper.xml文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- namespace:该mapper.xml映射文件的唯一标识 -->
<mapper namespace="com.cache.mapper.PersonMapper">
  <!- 开启二级缓存-->
    <cache/>
<select id="queryPersonById"  parameterType="int" resultType="com.cache.bean.Person">
    select
        id,name,age
    from
        t_person
    where
        id = #{id}
</select>
</mapper>

4、pom文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <settings>
        <!-- 开启日志,并制定使用的具体日志,LOG4J 对应 log4j.properties的文件名 -->
        <!--<setting name="logImpl" value="LOG4J"/>-->
        <!-- 开启延迟加载 -->
        <setting name="lazyLoadingEnabled" value="true"/>
        <!-- 关闭立即加载 -->
        <setting name="aggressiveLazyLoading" value="false"/>
        <!-- 开启二级缓存,默认不开启 -->
        <setting name="cacheEnabled" value="true"/>
        <!--<setting name="localCacheScope" value="STATEMENT"/>-->
    </settings>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatis01"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="com/cache/mapper/personMapper.xml"/>
    </mappers>
</configuration>

5、  测试类

/* 二级缓存 */
@Test
public void test001() throws Exception{

    Reader reader = Resources.getResourceAsReader("mybatis-01.xml");
    SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);

    SqlSession session01 = sessionFactory.openSession();
    PersonMapper personMapper01 = session01.getMapper(PersonMapper.class);
    Person person0101 = personMapper01.queryPersonById(1001);
    System.out.println("Session01,第一次查询结果为:" + person0101);
    session01.close(); // 进行缓存操作
    SqlSession session02 = sessionFactory.openSession();
    PersonMapper personMapper02 = session02.getMapper(PersonMapper.class);
    Person person0201 = personMapper02.queryPersonById(1001);
    System.out.println("Session02,第一次查询结果为:" + person0201);
    Person person0202 = personMapper02.queryPersonById(1001);
    System.out.println("Session02,第二次查询结果为:" + person0202);
    Person person0203 = personMapper02.queryPersonById(1001);
    System.out.println("Session02,第三次查询结果为:" + person0203);
    session02.close(); // 进行缓存操作
}

6、测试结果

"C:\Program Files\Java\jdk1.8.0_25\bin\java" -ea -Didea.test.cyclic.buffer.size=1048576 "-javaagent:C:\Users\newsoft\AppData\Roaming\JetBrains\IntelliJ IDEA 2017.3.5\lib\idea_rt.jar=1045:C:\Users\newsoft\AppData\Roaming\JetBrains\IntelliJ IDEA 2017.3.5\bin" -Dfile.encoding=UTF-8 -classpath "C:\Users\newsoft\AppData\Roaming\JetBrains\IntelliJ IDEA 2017.3.5\lib\idea_rt.jar;C:\Users\newsoft\AppData\Roaming\JetBrains\IntelliJ IDEA 2017.3.5\plugins\junit\lib\junit-rt.jar;C:\Users\newsoft\AppData\Roaming\JetBrains\IntelliJ IDEA 2017.3.5\plugins\junit\lib\junit5-rt.jar;D:\download\lib\mavenTollTransfer\mic-repository\org\junit\platform\junit-platform-launcher\1.5.2\junit-platform-launcher-1.5.2.jar;D:\download\lib\mavenTollTransfer\mic-repository\org\apiguardian\apiguardian-api\1.1.0\apiguardian-api-1.1.0.jar;D:\download\lib\mavenTollTransfer\mic-repository\org\junit\platform\junit-platform-engine\1.5.2\junit-platform-engine-1.5.2.jar;D:\download\lib\mavenTollTransfer\mic-repository\org\opentest4j\opentest4j\1.2.0\opentest4j-1.2.0.jar;D:\download\lib\mavenTollTransfer\mic-repository\org\junit\platform\junit-platform-commons\1.5.2\junit-platform-commons-1.5.2.jar;D:\download\lib\mavenTollTransfer\mic-repository\org\junit\jupiter\junit-jupiter-engine\5.5.2\junit-jupiter-engine-5.5.2.jar;D:\download\lib\mavenTollTransfer\mic-repository\org\junit\jupiter\junit-jupiter-api\5.5.2\junit-jupiter-api-5.5.2.jar;D:\download\lib\mavenTollTransfer\mic-repository\org\junit\vintage\junit-vintage-engine\5.5.2\junit-vintage-engine-5.5.2.jar;D:\download\lib\mavenTollTransfer\mic-repository\junit\junit\4.12\junit-4.12.jar;D:\download\lib\mavenTollTransfer\mic-repository\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar;C:\Program Files\Java\jdk1.8.0_25\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_25\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_25\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_25\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_25\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_25\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_25\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_25\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_25\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_25\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_25\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_25\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_25\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_25\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_25\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_25\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_25\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_25\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_25\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_25\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_25\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_25\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_25\jre\lib\rt.jar;D:\ideaworkspace\ProjectStudy\mybatis-cache-03\target\classes;D:\download\lib\mavenTollTransfer\mic-repository\org\hamcrest\hamcrest-core\2.1\hamcrest-core-2.1.jar;D:\download\lib\mavenTollTransfer\mic-repository\org\hamcrest\hamcrest\2.1\hamcrest-2.1.jar;D:\download\lib\mavenTollTransfer\mic-repository\org\mybatis\mybatis\3.4.5\mybatis-3.4.5.jar;D:\download\lib\mavenTollTransfer\mic-repository\mysql\mysql-connector-java\5.1.44\mysql-connector-java-5.1.44.jar;D:\download\lib\mavenTollTransfer\mic-repository\log4j\log4j\1.2.17\log4j-1.2.17.jar;D:\download\lib\mavenTollTransfer\mic-repository\org\slf4j\slf4j-log4j12\1.7.12\slf4j-log4j12-1.7.12.jar;D:\download\lib\mavenTollTransfer\mic-repository\org\slf4j\slf4j-api\1.7.30\slf4j-api-1.7.30.jar;D:\download\lib\mavenTollTransfer\mic-repository\cglib\cglib\3.3.0\cglib-3.3.0.jar;D:\download\lib\mavenTollTransfer\mic-repository\org\ow2\asm\asm\7.1\asm-7.1.jar;D:\download\lib\mavenTollTransfer\mic-repository\net\logstash\logback\logstash-logback-encoder\5.3\logstash-logback-encoder-5.3.jar;D:\download\lib\mavenTollTransfer\mic-repository\com\fasterxml\jackson\core\jackson-databind\2.10.3\jackson-databind-2.10.3.jar;D:\download\lib\mavenTollTransfer\mic-repository\com\fasterxml\jackson\core\jackson-annotations\2.10.3\jackson-annotations-2.10.3.jar;D:\download\lib\mavenTollTransfer\mic-repository\com\fasterxml\jackson\core\jackson-core\2.10.3\jackson-core-2.10.3.jar" com.intellij.rt.execution.junit.JUnitStarter -ideVersion5 -junit5 com.cache.test.test,test001
[lsjSso]2021-10-21 00:18:40,415-org.apache.ibatis.logging.LogFactory-0   [main]DEBUGorg.apache.ibatis.logging.LogFactory-Logging initialized using 'class org.apache.ibatis.logging.slf4j.Slf4jImpl' adapter.
[lsjSso]2021-10-21 00:18:40,563-org.apache.ibatis.datasource.pooled.PooledDataSource-148 [main]DEBUGorg.apache.ibatis.datasource.pooled.PooledDataSource-PooledDataSource forcefully closed/removed all connections.
[lsjSso]2021-10-21 00:18:40,563-org.apache.ibatis.datasource.pooled.PooledDataSource-148 [main]DEBUGorg.apache.ibatis.datasource.pooled.PooledDataSource-PooledDataSource forcefully closed/removed all connections.
[lsjSso]2021-10-21 00:18:40,564-org.apache.ibatis.datasource.pooled.PooledDataSource-149 [main]DEBUGorg.apache.ibatis.datasource.pooled.PooledDataSource-PooledDataSource forcefully closed/removed all connections.
[lsjSso]2021-10-21 00:18:40,564-org.apache.ibatis.datasource.pooled.PooledDataSource-149 [main]DEBUGorg.apache.ibatis.datasource.pooled.PooledDataSource-PooledDataSource forcefully closed/removed all connections.
[lsjSso]2021-10-21 00:18:40,671-com.cache.mapper.PersonMapper-256 [main]DEBUGcom.cache.mapper.PersonMapper-Cache Hit Ratio [com.cache.mapper.PersonMapper]: 0.0
[lsjSso]2021-10-21 00:18:40,679-org.apache.ibatis.transaction.jdbc.JdbcTransaction-264 [main]DEBUGorg.apache.ibatis.transaction.jdbc.JdbcTransaction-Opening JDBC Connection
[lsjSso]2021-10-21 00:18:40,938-org.apache.ibatis.datasource.pooled.PooledDataSource-523 [main]DEBUGorg.apache.ibatis.datasource.pooled.PooledDataSource-Created connection 2009221452.
[lsjSso]2021-10-21 00:18:40,938-org.apache.ibatis.transaction.jdbc.JdbcTransaction-523 [main]DEBUGorg.apache.ibatis.transaction.jdbc.JdbcTransaction-Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@77c2494c]
[lsjSso]2021-10-21 00:18:40,942-com.cache.mapper.PersonMapper.queryPersonById-527 [main]DEBUGcom.cache.mapper.PersonMapper.queryPersonById-==>  Preparing: select id,name,age from t_person where id = ? 
[lsjSso]2021-10-21 00:18:40,984-com.cache.mapper.PersonMapper.queryPersonById-569 [main]DEBUGcom.cache.mapper.PersonMapper.queryPersonById-==> Parameters: 1001(Integer)
[lsjSso]2021-10-21 00:18:41,012-com.cache.mapper.PersonMapper.queryPersonById-597 [main]DEBUGcom.cache.mapper.PersonMapper.queryPersonById-<==      Total: 1
Session01,第一次查询结果为:Person{id=1001, name='HuanCun', age=26}
[lsjSso]2021-10-21 00:18:41,017-org.apache.ibatis.transaction.jdbc.JdbcTransaction-602 [main]DEBUGorg.apache.ibatis.transaction.jdbc.JdbcTransaction-Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@77c2494c]
[lsjSso]2021-10-21 00:18:41,017-org.apache.ibatis.transaction.jdbc.JdbcTransaction-602 [main]DEBUGorg.apache.ibatis.transaction.jdbc.JdbcTransaction-Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@77c2494c]
[lsjSso]2021-10-21 00:18:41,017-org.apache.ibatis.datasource.pooled.PooledDataSource-602 [main]DEBUGorg.apache.ibatis.datasource.pooled.PooledDataSource-Returned connection 2009221452 to pool.
[lsjSso]2021-10-21 00:18:41,019-com.cache.mapper.PersonMapper-604 [main]DEBUGcom.cache.mapper.PersonMapper-Cache Hit Ratio [com.cache.mapper.PersonMapper]: 0.5
Session02,第一次查询结果为:Person{id=1001, name='HuanCun', age=26}
[lsjSso]2021-10-21 00:18:41,019-com.cache.mapper.PersonMapper-604 [main]DEBUGcom.cache.mapper.PersonMapper-Cache Hit Ratio [com.cache.mapper.PersonMapper]: 0.6666666666666666
Session02,第二次查询结果为:Person{id=1001, name='HuanCun', age=26}
[lsjSso]2021-10-21 00:18:41,020-com.cache.mapper.PersonMapper-605 [main]DEBUGcom.cache.mapper.PersonMapper-Cache Hit Ratio [com.cache.mapper.PersonMapper]: 0.75
Session02,第三次查询结果为:Person{id=1001, name='HuanCun', age=26}

Process finished with exit code 0

结果分析说明:

 

 

 

 

posted @ 2021-10-21 00:50 东北大亨 阅读(477) 评论(0) 推荐(1) 编辑
摘要: 创建bean方式,spring创建bean的方式包含:声明式样注入方式和编程式注入方式。分别为: 声明式样注入包含: 1)xml 配置化方式 2)@bean注解注入方式3)@Component方式 编程式注入包含: 4)接口注入方式 5)import 导入方式。 废话不多说,上代码, 第一种:xml 阅读全文
posted @ 2021-10-09 11:43 东北大亨 阅读(481) 评论(0) 推荐(0) 编辑
摘要: 代理模式概述 代理模式属于结构型模式,指的是为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。 代理模式包含角色及其职责: 抽象角色[Subject]:通过接口或抽象类声明真实角色待实现方法; 代 阅读全文
posted @ 2021-10-08 23:55 东北大亨 阅读(54) 评论(0) 推荐(0) 编辑
摘要: 说明: setConfigLocations主要包含两个功能展开:创建环境对象ConfigurableEnvironment 、处理ClassPathXmlApplicationContext传入的字符串中的占位符; 第一个:. 环境对象ConfigurableEnvironment中包含了当前JV 阅读全文
posted @ 2021-10-08 23:53 东北大亨 阅读(263) 评论(0) 推荐(0) 编辑
摘要: 【spring源码深度解析—容器的功能扩展之initPropertySources】 ApplicationContext提供了更多的扩展功能。BeanFactory是容器的顶层接口类,ApplicationContext实现了BeanFactory所有功能同时增强了接口实现和功能扩展。大多数情况下 阅读全文
posted @ 2021-10-08 23:52 东北大亨 阅读(1080) 评论(0) 推荐(0) 编辑
摘要: jquery中的ajax操作给后台传值 阅读全文
posted @ 2013-10-21 14:14 东北大亨 阅读(188) 评论(0) 推荐(0) 编辑
摘要: 由于很多朋友需要把自己写的共通类发不出来希望对大家有帮助。1. 封装类package cn.tycoon;import java.io.*;import java.lang.reflect.*;import java.util.*;import java.util.regex.Matcher;import java.util.regex.Pattern;import java.text.SimpleDateFormat;import org.apache.poi.hssf.usermodel.*;import org.apache.poi.hssf.util.HSSFColor;/*** 利用 阅读全文
posted @ 2012-12-20 17:42 东北大亨 阅读(1147) 评论(0) 推荐(0) 编辑
摘要: 最近有很多朋友用到select new 方法。下面我给大家举个简单的例子。定义类:public class TycoonRow implements Serializable { private static final long serialVersionUID = -8902581963250812345L; private int id; private String name; public TycoonRow(int id, String name) { super(); this.id = id; this.checkNo = name; } public int getId... 阅读全文
posted @ 2012-12-19 16:36 东北大亨 阅读(1357) 评论(0) 推荐(0) 编辑
该文被密码保护。 阅读全文
posted @ 2012-11-30 13:43 东北大亨 阅读(0) 评论(0) 推荐(0) 编辑
摘要: 最近看到有的朋友对 servlet 传值和取值有疑惑,针对次问题在此发表下在servlet中传值和取值操作html代码:<!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN"><html><head><title>东北大亨 用户校验的ajax</title><metahttp-equiv="keywords"content="keyword1,keyword2,keyword3"><metahttp- 阅读全文
posted @ 2012-11-30 11:43 东北大亨 阅读(419) 评论(0) 推荐(0) 编辑
摘要: 记录下以备学习用(摘录)1. 为何使用游标: 使用游标(cursor)的一个主要的原因就是把集合操作转换成单处理方式。用SQL语言从数据库中检 索数据后,结果放在内存的一块区域中,且结果往往是一个含有多个记录的集合无法实现所以用游标。游标机制允许用户在SQL server内逐行地访问这些记录,按照用户自己的意愿来显示和处理这些记录。 例子:2. 如何使用游标: 一般地,使用游标都遵循下列的常规步骤: (1) 声明游标。把游标与T-SQL语句的结果集联系起来。 (2) 打开游标。 (3) 使用游标操作数据。 (4) 关闭游标。 2.1. 声明游标 DECLARE CURSOR语句SQL-92.. 阅读全文
posted @ 2012-11-30 11:14 东北大亨 阅读(360) 评论(0) 推荐(0) 编辑
摘要: http://www.abab123.com/index.html 阅读全文
posted @ 2012-11-29 15:33 东北大亨 阅读(214) 评论(0) 推荐(0) 编辑
摘要: public string RunProcedure(OleDbParameter[] paramInput, OleDbParameter[] paramOutput, string procName) { int cnt = 0; string returnString = "-2"; try { String ConnStr = OleDbHelper.GetOleDBConnection(); using (OleDbConnection connection = new OleDbConnection(ConnStr)) { OleDbCommand cmd = 阅读全文
posted @ 2012-11-29 15:17 东北大亨 阅读(345) 评论(0) 推荐(0) 编辑
摘要: #SYNC 10;SET SCHEMA TYCOON_SP;SET CURRENT PATH = "SYSIBM","SYSFUN","SYSPROC","TYCOON_DB2_1";CREATE PROCEDURE DB2INST1.SP_UPP_INDEX123(IN "IN_ID" INTEGER IN "IN_SCHOOL_ID" INTEGER, IN "IN_CREATE_DATE" DATE, OUT "ROWCOUNT" 阅读全文
posted @ 2012-11-29 14:58 东北大亨 阅读(368) 评论(0) 推荐(0) 编辑
摘要: 我弄了小半天才弄出来,希望对有需要的朋友有所帮助和提示。欢迎光临如转载请说明出处。DROP SPECIFIC PROCEDURE DB2INST1.SQL121129100123456;#SYNC 10;SET SCHEMA TYCOON_SP;SET CURRENT PATH = "SYSIBM","SYSFUN","SYSPROC","NORTHTYCOON";CREATE PROCEDURE DB2INST1.SP_UP_P_INV_WASTE(IN "IN_CREATE_WHEN" DA 阅读全文
posted @ 2012-11-29 14:53 东北大亨 阅读(3386) 评论(0) 推荐(0) 编辑
摘要: 1.获取Return返回值SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["LocalSqlServer"].ToString());conn.Open();SqlCommand MyCommand = new SqlCommand("SQL", conn);MyCommand.CommandType = CommandType.StoredProcedure;MyCommand.Parameters.Add(new SqlParameter(&q 阅读全文
posted @ 2012-11-29 14:45 东北大亨 阅读(642) 评论(0) 推荐(0) 编辑
摘要: SQLSTATE消息本节列示SQLSTATE及其含义。表2. SQLSTATE类代码 类代码含义 要获得子代码,参阅...00完全成功完成 表301警告 表402无数据 表507动态SQL错误 表608连接异常 表709触发操作异常 表80A功能部件不受支持 表90D目标类型规范无效 表100F无效标记 表110K RESIGNAL语句无效 表120N SQL/XML映射错误 表1320找不到CASE语句的条件 表1521基数违例 表1622数据异常 表1723约束违例 表1824无效的游标状态 表1925无效的事务状态 表2026无效SQL语句标识 表2128无效权限规范 表232D无效事务 阅读全文
posted @ 2012-11-16 11:03 东北大亨 阅读(1574) 评论(0) 推荐(0) 编辑
摘要: sql top 实例sql server 语法:SELECT TOP number|percent column_name(s)FROM table_name例子:SELECT TOP 2 * FROM employee sql 语句中 percent 的用法:从 "employee" 表中选取 50% 的记录。我们可以使用下面的 SELECT 语句:SELECT TOP 50 PERCENT * FROM employeeDB2 中的实现方式为:语法为:select column_name(s)from table_namefetch first number rows 阅读全文
posted @ 2012-11-16 10:19 东北大亨 阅读(717) 评论(0) 推荐(0) 编辑
摘要: 阅读全文
posted @ 2012-11-12 12:24 东北大亨 阅读(240) 评论(0) 推荐(0) 编辑
摘要: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><title>first-3</title><meta http-equiv="Content-Type" con 阅读全文
posted @ 2012-11-06 15:52 东北大亨 阅读(160) 评论(0) 推荐(0) 编辑
摘要: 1、下载 IDEA(以本人安装2021.1.3 为例) 【浏览器输入】: 官网下载历史版本地址URL https://www.jetbrains.com/idea/download/other.html 选择 2021.1.3 版本下载 【下载完安装】 安装路径为: D:\install\JetBr 阅读全文
posted @ 2025-02-27 08:27 东北大亨 阅读(13) 评论(0) 推荐(0) 编辑
摘要: 1、后台管理mysql数据库 在控制台下执行:mysqladmin -u root -p shutdown 2、登录后台 mysql安装目录bin下执行: ./mysql -hlocalhost -uroot -p 3、启动mysql 在后台执行,例如mysql安装在 home/mysql 下,配置 阅读全文
posted @ 2024-11-01 19:12 东北大亨 阅读(7) 评论(0) 推荐(0) 编辑
摘要: 1、描述:重启数据库日志报错信息为:Table 'QRTZ_LOCKS' donesn`t exist 截图: 2、分析 由于迁移了数据库,从LINUX服务器A服务mysql迁移到LINUX服务器B。数据库用分布式数据库表为小写的,而在程序配置文件中使用的大写字母,所以导致QRTZ_LOCKS不存在 阅读全文
posted @ 2024-11-01 19:01 东北大亨 阅读(59) 评论(0) 推荐(0) 编辑
摘要: 描述:今天重启mysql,日志报错信息为: [Warning] World-writable config file '/etc/my.cnf' is ignored. 修改my.cnf不生效 截图信息为: 分析:报错信息大概是说mysq的配置文件my.cnf 权限是全局可写的权限太高了,mysql 阅读全文
posted @ 2024-11-01 18:44 东北大亨 阅读(685) 评论(0) 推荐(0) 编辑
摘要: 1、 description: use combined and and or query in the mongo 2、sql query statement: select * from deviceInfo where devId='11010001' and (sndStatus=0 or 阅读全文
posted @ 2024-10-03 13:58 东北大亨 阅读(3) 评论(0) 推荐(0) 编辑
摘要: 一、问题描述 SpringBoot 整合 分布式定时器 Quartz后,job中注入的自定义service,使用@Autowired 从spring容器中获取的对象为null,报空指针异常。 二、问题分析 sping容器可以管理Bean,但是Quartz的job是分布式定时器自己管理,所有通过@Au 阅读全文
posted @ 2024-09-14 20:08 东北大亨 阅读(63) 评论(0) 推荐(0) 编辑
摘要: 1、编辑配置 2、在弹出配置中增加 要使用端口接口,添加端口参数配置、设置VM options: 参数值为: -Dserver.port= portNumber 下面以应用 TranSendServiceApplication 为例,增加两个端口:8099 和8091 为例。截图如下: 阅读全文
posted @ 2024-09-13 18:50 东北大亨 阅读(586) 评论(0) 推荐(0) 编辑
摘要: 一、创建后台运行 sh 文件,内容如下: #!/bin/bash # 设置环境变量export JAVA_HOME=/usr/local/java/jdk-1.8.0_25export CLASSPATH=.:$JAVA_HOME/lib/export PATH=.:$JAVA_HOME/bin:$ 阅读全文
posted @ 2024-09-13 18:42 东北大亨 阅读(148) 评论(0) 推荐(0) 编辑
摘要: 邮件通知是现代应用中常见的一种通信方式,特别是在需要及时反馈、告警或重要事件通知的场景下。Spring Boot提供了简单而强大的邮件发送功能,本文将通过pring Boot中使用JavaMailSender 接口实现邮件发送。 使用场景说明 注册验证:在用户注册、商户注册时,通过邮件发送验证码进行 阅读全文
posted @ 2024-07-18 01:32 东北大亨 阅读(79) 评论(0) 推荐(0) 编辑
摘要: 使用SpringMVC 的 controller中接收文件,如果只是接收一个文件,声明MultipartFile 或者指定@RequestParam注解,参数(strReqBody 和 images )与前端参数一致即可 例:第一种方式 public void uploadImg(Multipart 阅读全文
posted @ 2024-06-21 15:34 东北大亨 阅读(227) 评论(0) 推荐(0) 编辑
点击右上角即可分享
微信分享提示