Redis Desktop Manager连不上服务器的redis
1、首先有没有设置密码,输入的密码是否正确
2、那个IP是内网IP嘛?外网的要加SSH
总结一下
无论是连MySQL、MongoDB、还是redis
ip如果是内网ip
那么外网就要加SSH
计算机网络技术
死锁
不同的线程分别占用对方需要的同步资源不放弃,都在等待对方放弃自己需要的同步资源,就形成了线程的死锁。
危害:
1、死锁会使得进程得不到正确、预期的结果
2、死锁使得资源利用率降低
3、还会导致新的死锁
例如:如果线程1锁住了A,然后尝试对B进行加锁,同时线程2已经锁住了B,接着对A进行加锁,这样死锁就发生了。线程1永远得不到B,线程2永远得不到A, 它们也不知道发生了什么,为了得到彼此的对象,它们将永远阻塞下去。
经典案例:每个人都有一个筷子,互相不给,形成不了一双
死锁:不会出异常和提示
只是所有的线程都处于阻塞的状态,无法继续执行
解决办法是
专门算法、减少同步的资源定义,尽量避免嵌套同步
和解决线程安全的方式synchronize(自动)及lock锁(手动)解决线程的安全要区别开来,不是同一个概念
泛型
1、泛型是什么?为什么要用?
把类型明确的工作推迟到创建对象或调用方法的时候才去明确的特殊的类型
参数化类型:
把类型当作是参数一样传递
<数据类型> 只能是引用类型
为什么要用泛型?
没有泛型的时候,任何类型都可以添加到集合中,造成类型的不安全。String 类型对象读取出来的对象需要强转:繁琐 可能有ClassCastException
有了泛型以后:
代码更加简洁【不用强制转换】
程序更加健壮【只要编译时期没有警告,那么运行时期就不会出现ClassCastException异常】
可读性和稳定性【在编写集合的时候,就限定了类型】
2、泛型的类型有哪些?T、<>比较常见
E - Element (在集合中使用,因为集合中存放的是元素)
T - Type(Java 类) K - Key(键)
V - Value(值) N - Number(数值类型)
?- 表示不确定的java类型-------》通配符 S、U、V - 2nd、3rd、4th types
事务
1、应用场景
转账,支付和收款金额的一致性!不能出错
用一个简单例子说明:银行转帐业务,账户A要将自己账户上的1000元转到B账户下面,A账户余额首先要减去1000元,然后B账户要增加1000元。假如在中间网络出现了问题,A账户减去1000元已经结束,B因为网络中断而操作失败,那么整个业务失败,必须做出控制,要求A账户转帐业务撤销。这才能保证业务的正确性,完成这个操走就需要事务,将A账户资金减少和B账户资金增加放到同一个事务里,要么全部执行成功,要么全部撤销,这样就保证了数据的安全性。
购买商品时的次数
2、事务定义
事务(Transaction),一般是指要做的或所做的事情。在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。
3、事务四大特性
原子性(atomicity):事务是数据库的逻辑工作单位,而且是必须是原子工作单位,对于其数据修改,要么全部执行,要么全部不执行。
转账和收款同时成功,或者同时失败,如果一方成功,一方失败会引起金融界的恐慌。
一致性(consistency):事务在完成时,必须是所有的数据都保持一致状态。在相关数据库中,所有规则都必须应用于事务的修改,以保持所有数据的完整性。(实例:转账,两个账户余额相加,值不变。)
原子性、隔离性、持久性都是为了实现一致性
A余额是0,A还转1000给B,事务的一致性不会让这样的操作成功的
隔离性(isolation):一个事务的执行不能被其他事务所影响。
相互独立,互不影响
持久性(durability):一个事务一旦提交,事物的操作便永久性的保存在DB中。即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。
转账是一个永久的事,不能出现今天A转账给B,一年后转账说交易失败,这样也会引起大家的恐慌。
servlet
servlet
查询
页面
-------》BookServlet程序
1、查询全部图书
2、保存到Request域中
3、请求转发到pages/manager/manager.jsp页面
-----》pages/manager/manager.jsp
显示所有图书信息
1、从Request域中获取全部图书信息
2、使用JSTL标签库遍历输出
那是因为jsp无法直接访问数据库,所以通过Servlet来访问数据库
添加
在jsp添加页面输入数据后
-----》BookServlet程序
1、获取请求的参数,封装成Book对象
2、调用BookService.addBook()保存图书
3、跳到图书列表页面
/manager/bookServlet?action=list
刷新数据,显示添加的图书
删除
1、获取请求的参数id,图书信息
2、调用bookService.deleteBookById();
3、重定向回到图书列表管理页面
/book/manager/bookServlet?action=list
修改
图书列表中jsp页面
—》点击【修改】跳转方向路径是:manger/bookServlet?action=getBook&id=图书编号
—》BookServlet程序
getBook() 获取要修改的图书信息
1、获取图书编号
2、调用BookService.queryBookById(id):Book:得到修改图书信息
3、把图书保存在Request域中
4、请求转发到/pages/manager/book_edit.jsp页面中
update() 保存修改图书的操作
1、获取请求的参数==封装成为Book对象
2、调用BookService.updateBook(book);修改图书
3、重定向回到图书列表管理页面
地址:/工程名/manage/bookServlet?action=list
----》把修改的图书信息,带到表单中,去显示
到回页面
Spring事务
3.1.1 xml事务
<!--平台事务管理器-->
<bean id="transactionoManager1"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource1"></property>
</bean>
<!--事务增强、通知配置-->
<tx:advice id="txAdvice1" transaction-manager="transactionoManager1">
<tx:attributes>
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
<!--事务aop增强 织入-->
<aop:config>
<aop:pointcut id="myPointcut1" expression="execution(*
com.study.service.Impl.*.*(..))"/>
<aop:advisor advice-ref="txAdvice1" pointcut-ref="myPointcut1"></aop:advisor>
</aop:config>
3.1.2 注解声明式配置
1.平台事务管理器配置(xml方式)
2、事务通知的配置(@Transactional注解配置)
//属性可选,可以省略不写
@Transactional(value = "transactionoManager1",isolation = Isolation.READ_COMMITTED,propagation = Propagation.REQUIRED)
3、事务注解驱动的配置<tx:annotation-driven/>
<!--事务注解驱动-->
<tx:annotation-driven/>
Integer类型与Date类型错误设置不等于空字符串,判定不等于空字符串
!=‘‘的前提要用字符串去判定,如何不是,会报错的!
Integer类型与Date类型不要设置!=‘‘,判定不等于空字符串
### Error querying database. Cause: java.lang.IllegalArgumentException: invalid comparison: java.util.Date and java.lang.String
### Cause: java.lang.IllegalArgumentException: invalid comparison: java.util.Date and java.lang.String
at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:149)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:140)
at sun.reflect.GeneratedMethodAccessor298.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:426)
... 71 common frames omitted
集合
1、集合是什么?为什么要用集合?集合解决了什么问题?
Java集合类存放在java.util包中,是一个用来存放对象的Java容器。集合和数组一样,都是对于多个数据进行存储操作的结构。
数组不挺好用的么,为什么还要用集合呢??
数组长度是固定的,只能存放同一类型的数据!!!
如果随着代码的复杂性越高,想要改变长度类型怎么办?!
数组的添加、删除、插入数据等操作不好用,效率不高
过去数组中实际的元素个数需要实现不了。
这时产生了集合
1 集合只能存放对象,对对象的引用,还可以存放不同类型,不限数量
2 数组只能有序、元素可重复对吧!集合都可以的!
HashSet是无序的,不可重复的
集合的分类
Collection接口:单列集合====一个一个对象
list接口:有序、可重复的数据 —》相当于动态的数组
ArrayList、LinkedList、Vector
set接口:无序、不可重复
HashSet、LinkedHashSet、TreeSet
Map接口:双列集合:用来存储一对(key-value)一对的数据
HashMap、LinkedHashMap、TreeMap、Hashtable、Properties
java8新特性
java8新特性 速度更快
代码更少
强大的Stream API
便于并行
最大化减少空指针的异常Optional
Nashom引擎,允许在JVM上运行JS应用
2、Lambda表达式
Lambda是一个匿名函数
格式为
(parameters) -> expression 或 (parameters) ->{ statements; }
Lambda操作符也称为箭头操作符
左边是lambda形参列表,其实就是接口中的抽象方法的形参列表
右边是lambda体,就是重写抽象方法的方法体
3、Java8新特性
Stream API 和 Lambda表达式为新特性重要的一个改变
Stream API对集合数据进行操作,类似使用SQL执行的数据库查询。
常见的注解实例
常见的注解实例
@Override:验证重写父类的方法,没有重写则报错
@Deprecated : 过时了,idea通常会用横线划掉
@SuppressWarnings:Eclipse某个值没有使用,黄色警告处理