据说看字识人性格,那就分析下我的字吧

前言 在Spring的第二篇中主要讲解了Spring Core模块的使用IOC容器创建对象的问题,Spring Core模块主要是解决对象的创建和对象之间的依赖关系,因此本博文主要讲解如何使用IOC容器来解决对象之间的依赖关系! 回顾以前对象依赖 我们来看一下我们以前关于对象依赖,是怎么的历程 直接new对象 在最开始,我们是直接new对象给serice的userDao属性赋值...
UserService{
UserDao userDao = new UserDao();
写DaoFactory,用字符串来维护依赖关系 后来,我们发现service层紧紧耦合了dao层。我们就写了DaoFactory,在service层只要通过字符串就能够创建对应的dao层的对象了。 DaoFactory
public class DaoFactory {
private static final DaoFactory factory = new DaoFactory();
private DaoFactory(){}
public static DaoFactory getInstance(){
public &T& T createDao(String className,Class&T& clazz){
T t = (T) Class.forName(className).newInstance();
}catch (Exception e) {
throw new RuntimeException(e);
详细解读阿里巴巴开源技术,包括框架、组件、引擎、数据库/存储、平台/系统、解决方案、工具、中间件、Web Sever、设计等十大类73款!
这里需要说明,很多开发者觉得 Memcached 是一种分布式 Cache ,但其实 Memcached 服务端本身是单实例的,只是在客户端实现过程中可以根据存储的主键作分区存储,而这个区就是 Memcached 服务端的一个或者多个实例,如果将客户端也囊括到 Memcached 中,那么可以部分概念上说是集中式的。集中式的构架,无非两种情况: 1. 节点均衡的网状( JBoss Tree Cache ),利用 JGroup 的多播通信机制来同步数据。 2.Master-Slaves 模式(分布式文件系统),由 Master 来管理 Slave ,如何选择 Slave ,如何迁移数据,都是由 Master 来完成,但是 Master 本身也存在单点问题。 特性、优点和限制 Memory :内存存储,速度快,对于内存的要求高,所缓存的内容非持久化。对于 CPU 要求很低,所以常常采用将 Memcached 服务端和一些 CPU 高消耗 Memory 低消耗应用部属在一起 。(否则会互相挤占资源) 集中式 Cache :避开了分布式 Cache 的传播问题,但是需要非单点保证其可靠性,这需要 cluster 的工作,可以将多个 Memcached 作为一个虚拟的 cluster ,同时对于 cluster 的读写和普通的 memcached 的读写性能没有差别。 分布式扩展...
Consul 是 HashiCorp 公司推出的开源工具,用于实现分布式系统的服务发现与配置
java.io.FileNotFoundException: C:\Users\ABC\.m2\repository\com\mchange\c3p0\0.9.5.2\mchange-commons-java-0.2.11.jar (The system cannot find the file specified)
1.什么是SolrCloud SolrCloud(solr 云)是Solr提供的分布式搜索方案,当你需要大规模,容错,分布式索引和检索能力时使用 SolrCloud。当一个系统的索引数据量少的时候是不需要使用SolrCloud的,当索引量很大,搜索请求并发很高,这时需要使用SolrCloud来满足这些需求。 SolrCloud是基于Solr和Zookeeper的分布式搜索方案,它的主要思想是使用Zookeeper作为集群的配置信息中心。 它有几个特色功能: 1)集中式的配置信息 2)自动容错 3)近实时搜索 4)查询时自动负载均衡 3. Solr集群的系统架构 ![1](https://static.oschina.net/uploads/img/04532_06xH.png "在这里输入图片标题") 3.1. 物理结构 三个Solr实例( 每个实例包括两个Core),组成一个SolrCloud。 3.2. 逻辑结构 索引集合包括两个Shard(shard1和shard2),shard1和shard2分别由三个Core组成,其中一个Leader两个Replication,Leader是由zookeeper选举产生,zookeeper控制每个shard上三个Core的索引数据一致,解决高可用问题。 用户发起索引请求分别从shard1和shard2上获取,解决高并发问题。 3.2.1. collection Collection在SolrCloud集群中是一个逻辑意义上的完整的索引结构。它常常被划分为一个或多...
当钉钉和企业微信这对背靠巨头的流量之子先后入局,就注定了中国企业服务市场进入了一个竞争更加激烈的时代。 通用型SaaS工具市场难有机会,产品场景化体验要求越来越高,投资人对SaaS的投资更加谨慎…… 中国企业服务市场正处在一道分水岭,TOB商业形态会出现什么样的变化?新商业将带来哪些新价值?产业互联浪潮下,如何将这些新价值最大化? 近日,国内最具影响力的企业服务平台崔牛会宣布,将于4月19日举办“新商业o新价值”2018中国企业互联网春季峰会。 “中国企业服务市场开始逐步进入了深水区,服务商开始思考——能在哪些垂直领域扎根,能在哪些应用场景上深化,这是很明显的进步。 但从全球视角来看中国TOB市场是什么样?今天的云计算,到底给我们带来了什么? 这正是我们在此次春季峰会上想要和大家共同探讨的。”崔牛会联合创始人、市场副总裁李伟表示。 算起来,这已经是崔牛会举办的第五届企业互联网春季峰会。据悉,此次峰会将有超过2000位来自全球各地的TOB领域从业者深度参与,数十位业内顶级大咖现场分享。 从崔牛会此前透露的信息来看,本次峰会将有六大亮点: 1、1份中国企业服务云图发布 崔牛会曾在2017年春季峰会发布了国内首张《中国企业服务云图》...
生产销售链条跟踪涉及环节,农产品的供应链是一个非常复杂的过程,涉及多方,农业局、卫生局、药监局、工商局、环保局等多个部门交织其中。
本文主要介绍卷积神经网络(CNN)的经典模型VGGNet的特点和网络结构,包括VGG16、VGG19等
最近使用`consul`作为项目的服务注册与服务发现的基础功能。在塔建集群使用中遇到一些坑,下面一个个的记录下来。 ## consul集群多node consul集群的node也就是我们所说的consul实例。集群由多个node组成,为了集群的可用性,需要超过半数的node启用server。如5个node中建议3个启用server模式,3个node组成的集群就2个node启用server模式。 看到这里的时候你一定觉得没有什么问题呀,但是consul坑就是多。加入你的集群组成如下: ``` Node Address Status Type Build Protocol DC Segment BJ-MQTEST-01 10.163.145.117:8301 alive server 1.0.6 2 iget-topology-aliyun BJ-MQTEST-02 10.163.147.47:8301 alive server 1.0.6 2 iget-topology-aliyun BJ-TGO-01 10.163.145.110:8301 alive client 1.0.6 2 iget-topology-aliyun ``` 那么client可以使用上述的3个ip连接到consul集群,假设client A使用使用10.163.145.117注册了service,重启后使用地址10.163.145.110注册之前的service信息,此时你就会惊喜的发现,UI可以同时看到在同一个servicename下存在两个相同的serviceid。 这就是consul集群多node的坑,因为service底层虽然使用了KV存储,但是service的KEY与serviceid...
分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。 有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。 而twitter的SnowFlake解决了这种需求,最初Twitter把存储系统从MySQL迁移到Cassandra,因为Cassandra没有顺序ID生成机制,所以开发了这样一套全局唯一ID生成服务。 **关注公众号,搜云库,专注于开发技术的研究与知识分享,获取最新文章** ![搜云库](https://static.oschina.net/uploads/img/24519_ejux.jpg "在这里输入图片标题") # 原理 Twitter的雪花算法SnowFlake,使用Java语言实现。 SnowFlake算法产生的ID是一个64位的整型,结构如下(每一部分用“-”符号分隔): ``` 0 -
0 - 00000 - 00000 -
``` **1位标识部分**,在java中由于long的最高位是符号位,正数是0,负数是1,一般生成的ID为正数,所以为0; **41位时间戳部分**,这个是毫秒级的时间,一般实现上不会存储当前的时间戳,而是时间戳的差值(当前时间-固定的开始时间),这样可以使产生的ID从更...
前言 前面已经学习了Struts2和Hibernate框架了。接下来学习的是Spring框架...本博文主要是引入Spring框架... Spring介绍 Spring诞生: 创建Spring的目的就是用来替代更加重量级的的企业级Java技术 简化Java的开发 基于POJO轻量级和最小侵入式开发 通过依赖注入和面向接口实现松耦合 基于切面和惯例进行声明式编程 通过切面和模板**减少样板式代码 ** 侵入式概念 Spring是一种非侵入式的框架... 侵入式 对于EJB、Struts2等一些传统的框架,通常是要实现特定的接口,继承特定的类才能增强功能 改变了java类的结构 非侵入式 对于Hibernate、Spring等框架,对现有的类结构没有影响,就能够增强JavaBean的功能 松耦合 前面我们在写程序的时候,都是面向接口编程,通过DaoFactroy等方法来实现松耦合
private CategoryDao categoryDao = DaoFactory.getInstance().createDao("zhongfucheng.dao.impl.CategoryDAOImpl", CategoryDao.class);
private BookDao bookDao = DaoFactory.getInstance().createDao("zhongfucheng.dao.impl.BookDaoImpl", BookDao.class);
private UserDao userDao = DaoFactory.getInstance().createDao("zhongfucheng.dao.impl.UserDaoImp...
摘要: 本着探究下iOS Crash捕获的目的,学习了下Crash捕获相关的Mach异常和signal信号处理,记录下相关内容,并提供对应的测试示例代码。Mach为XNU的微内核,Mach异常为最底层的内核级异常,在iOS系统中,底层Crash先触发Mach异常,然后再转换为对应的signal信号。 作者:阿里云-移动云-大前端团队 原文链接:http://click.aliyun.com/m/43672/ 本着探究下iOS Crash捕获的目的,学习了下Crash捕获相关的Mach异常和signal信号处理,记录下相关内容,并提供对应的测试示例代码。Mach为XNU的微内核,Mach异常为最底层的内核级异常,在iOS系统中,底层Crash先触发Mach异常,然后再转换为对应的signal信号。 1. iOS Mach异常 1.1 XNU Darwin是Mac OS和iOS的操作系统,而XNU是Darwin操作系统的内核部分。XNU是混合内核,兼具宏内核和微内核的特性,而Mach即为其微内核。 Darwin操作系统和MacOS、iOS系统版本号的对应如上图所示,Mac可执行下述命令查看Darwin版本号。 system_profiler SPSoftwareDataType 1.2 Mach Mach:[m?k],操作系统微内核,是许多新操作系统的设计基础。 Mach微内核中有几个基础概念: Tasks,拥有一组系统资源的对象,允许”thread”在其中执行。
该篇主要记录 druid 在 Spring Boot 中的 配置、单数据源、多数据源及动态数据源的使用
raft有和多种语言实现,其中在go语言中,etcd的实现是公认的典范,本文就是从源码级别探索etcd的raft是如何实现的,这样可以让我们一步一步了解raft论文是如何实现为一个工程的。
注:不清楚raft是什么的可以先去看我的另一篇文章https://my.oschina.net/fileoptions/blog/883497 例子
etcd将raft单独抽象、实现为一个模块,同时也为raft模块提供了一个基本例子,在etcd源码中,它就是contrib/raftexample,进到该目录下,我们可以首先看README,里面已经有非常详细的例子使用方法了,我这里就再赘述一次。
首先,我们在build之后,在目录下会产生一个raftexample的可执行文件,此时可以使用如下命令启动一个raft实例(single-member cluster): raftexample --id 1 --cluster http://127.0.0.1:12379 --port 12380
上面这条命令意思是,启动了一个raft实例的kv存储引擎,id选项用于执行本raft实例的id,cluster选项执行集群的成员地址信息,port选项指定kv存储引擎的服务端口。
启动成功之后,此时我们可以向存储引擎存储一个值: curl -L http://127.0.0.1:12380/my-key -XPUT -d hello
然后我们...
在进行网页或应用程序后台接口开发时,一般要及时测试开发的接口能否正确接收和返回数据,对于单次测试,Postman插件是个不错的Http请求模拟工具。
但是Postman只能模拟单客户端的单次请求,而对于模拟多用户并发等性能测试,就必须借助其他的工具了,这里推荐功能强大的JMeter自动化测试工具 Apache JMeter - Apache JMeter(TM) Apache JMeter是Apache组织开发的基于Java的压力测试工具。用于对软件做压力测试,它最初被设计用于Web应用测试但后来扩展到其他测试领域。 它可以用于测试静态和动态资源例如静态文件、Java 小服务程序、CGI 脚本、Java 对象、数据库, FTP 服务器, 等等。JMeter 可以用于对服务器、网络或对象模拟巨大的负载,来自不同压力类别下测试它们的强度和分析整体性能。 下面就以上图的Restful类型的接口为例简单介绍使用Jmeter进行接口测试的方法。 获取某个具体网关设备的基本信息。 请求 方法:GET URI:/api/gateway/&gateway_id& 参数: 在HTTP请求(http request)的头部(header)添加Userid和Token字段作为用户验证字段 参数名 必需 类型 说明 gateway_id true int 网关ID,置于URL内 响应 返回值:JSON格式的网关信息 参数: 参数...
如何在一个斜面上创建 3D 模型?如何通过拖拽创建 3D 模型?这些我们在实际项目中用到的概率也着实不低。我们知道,空间中存在无数个面,一个点和一条法线就能创建一个面,如何利用好这两个部分?
NSPredicate在iOS中提供了通用的查询描述方式,其可以用来处理集合,对象,CoreData以及Spotlight的查询操作。本篇博客主要总结NSPredicate在iOS开发中的应用,并通过代码示例来帮助初学者更快更容易的理解和使用谓词查询系统。
面向各部门组织的技术分享活动,一起探讨、学习,愿能有所得。
翻看了无数的文章没有找到一篇关于谈征信在区块链上怎么落地的文章。也在各种区块链微信群和QQ群中问了一圈,也没有人知道怎么落地。 现在的情况是大家都知道区块链做征信没问题,区中心化,不可撰改,简直是征信系统而设计的。那么怎么使项目落地呢?没有一篇文章谈到这个问题。可能有些大公司已经实现了,处于技术保密,没有分享。 看来只能靠自己了,以太坊和超级账本一直在研究,最近一段时间研究以太坊比较多,但是发现征信这个系统是在不适合在以太坊上实现,于是有回到超级账本上。
Now your life, life in the future to play you, now do not work hard, the future suck. 现在不玩命,将来命玩你,现在不努力,未来不给力。
指针 vs 值类型实现接口 我们在第1部分中讨论的所有示例接口都是使用值receivers 实现的。也可以使用指针receivers 来实现接口。在使用指针receivers 实现接口时需要注意的细微之处。让我们了解使用下面的程序。 package main
import "fmt"
type Describer interface {
Describe()
type Person struct {
name string
func (p Person) Describe() { //implemented using value receiver
fmt.Printf("%s is %d years old\n", p.name, p.age)
type Address struct {
country string
func (a *Address) Describe() { //implemented using pointer receiver
fmt.Printf("State %s Country %s", a.state, a.country)
func main() {
var d1 Describer // 接口类型变量
p1 := Person{"Sam", 25}
d1.Describe()
p2 := Person{"James", 32}
// 指针类型
d1.Describe()
var d2 Describer
a := Address{"Washington", "USA"}
生产销售链条跟踪涉及环节,农产品的供应链是一个非常复杂的过程,涉及多方,农业局、卫生局、药监局、工商局、环保局等多个部门交织其中。
Kubernetes 1.5正式发布StatefulSet,在Kubernetes 1.9 stable。这里将对StatefulSet进行解读分析,包括最佳实践、与Deployment的主要区别、Node网络异常等情况下处理方法以及在网络、存储、伸缩、滚动更新方面的原理解析等内容。下一篇博客将对StatefulSet Controller进行源码分析,相信一定会有其他收获。
Groovy运行于JVM之上,然而其对**动态语言**、**函数式编程范式**以及**元编程功能**的加持所带来的表现力和简洁性可以说甩了Java几条街。我们可以利用Groovy的所有动态功能构建高性能的JVM应用、将开发效率提高几个数量级! 这就是我们为什么要学它!
本文主要介绍卷积神经网络(CNN)的经典模型VGGNet的特点和网络结构,包括VGG16、VGG19等
作为职场老手的你,也许对服务化(SOA)并不陌生。当今 Web 2.0 架构如火如荼,越来越多的企业正在进行着服务化的改造,最为著名莫过于 Amazon 。
多系统之间通讯现在最常用的是使用标准的http服务,如:restful,定义企业通用的数据格式。怎样定义一个标准,定义一种编码规范,让所有的开发者遵循这个标准?
结合我们公司服务返回数据的格式,自己写了一个通用的工具类,有兴趣的朋友可以使用一下。 1. 定义一个ResponseVO对象,代码如下:2. 定义标准的ResponseCode,代码如下: &span style="font-size: 16"&public class ResponseVO {
//返回消息
private String version = "v1.0";
//data对象
public String getVersion() {
public void setVersion(String version) {
this.version =
public int getCode() {
public void setCode(int code) {
this.code =
public String getMessage() {
public void setMessage(String message) {
this.message =
public Object getData() {
public void setData(Object data) {
this.data =
public ResponseVO() {
搞了三年的Java开发,突然被朋友问到Java到底是值传递还是引用传递,被问到时突然发现自己从来没有留意过这方面的问题,查阅资料后,做一下记录吧!
本节学习如何将应用回滚到某个特定 revision。
笔记和代码都放在码云:https://gitee.com/tangijia/anguarjs_learning_notes
在前面的章节中,我们着手介绍了dubbo的相关知识,在这个基础之上,我们可以考虑将dubbo服务应用于我们的分布式系统了,从今天开始,我们会详细介绍如何将dubbo和spring集成并应用于我们的分布式系统。 1. 创建ant-bookmark-facade项目(dubbo服务接口),其中pom.xml文件定义如下: &span style="font-size: 16"&&?xml version="1.0"?&
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&
&modelVersion&4.0.0&/modelVersion&
&groupId&com.sml.sz&/groupId&
&artifactId&ant-project&/artifactId&
&version&1.0.0&/version&
&artifactId&ant-member-facade&/artifactId&
&packaging&jar&/packaging&
&name&ant-member-facade&/name&
&url&http://maven.apache.org&/url&
&description&ant的收藏模块Dubbo服务接口包,提供相关的Dubbo服务入口&/description&
&properties&
&project.build.sourceEncoding&UTF-8&/project.build.sourceEncoding&
&/properties&
&dependencies&
# 摘要 为了让大家能快速对android组件化有个整体的认识,本文将从多个维度对目前网上一些有代表性的开源组件化开发方案进行对比,从而更好的区分各组件化方案的特点,快速选择适合自己使用的方案深入学习并使用,在面试中被问到时也能做到心中有数。 # 前言 --- android平台上组件化开发的概念近两年非常火热,有些同学反映在面试中被问到的频率也很高。 目前网上关于组件化开发方案的文章、开源库比较多,让很多初学者感到迷茫,不知该从何处入手,难以确定自身的业务特性适合使用哪种框架,如果全部都学习一遍成本比较高,而且在学习过程中容易将各方案的一些特性记混淆。 为了让大家能快速对android组件化有个整体的认识,本文将从多个维度对目前网上一些有代表性的开源组件化开发方案进行对比,从而更好的区分各组件化方案的特点,快速选择适合自己使用的方案深入学习并使用,在面试中被问到时也能做到心中有数。 由于篇幅及个人精力所限,只选取了比较有代表性的几个组件化方案进行比较,对比内容中如有谬误之处,欢迎大家指正,可以在评论中留言或者[提issue](https://github.com/luckybilly/AndroidComponentizeLibs/issues/new)和[pr](https://github.com/luckybi...
http://blog.csdn.net/omnispace/article/details/
# -*- coding:utf-8 -*-
from selenium import webdriver
from PythonHTTP调用示例.YDMHTTP import YDMHttp
#引用显示等待
from selenium.webdriver.support.ui import WebDriverWait
from PIL import Image
driver = webdriver.Firefox()
driver.get("https://ics.autohome.com.cn/passport/account/login")
# 找到用户名输入
username = WebDriverWait(driver,10).until(lambda driver: driver.find_element_by_id("UserNameDealer"))
username.send_keys("元信汽车")
# 找到密码框输入
password = WebDriverWait(driver, 10).until(lambda driver:driver.find_element_by_id("PasswordDealer"))
password.send_keys("123456")
# 找到验证码标签
captcha = WebDriverWait(driver, 10).until(lambda driver:driver.find_element_by_id("imgValidCodeDealer"))
captcha.screenshot(filename="captcha.png")
# 截图保存的另一个函数
# driver.save_screenshot("page.png")
# left = captcha.location["x"]
# top = captcha.location["y"]
# right = captcha.location["x"] + captcha.size["width"]
# bottom = captcha.location["y"] + captcha.size["height"]
据国外媒体报道,世界各地都对辛辣食物有着独特的情愫。泰国菜、墨西哥菜、中餐、印度菜、埃塞俄比亚菜等美食恨不得让你嘴中喷火,却又令人回味无穷。
想学习 libvirt python 开发,苦于网上没有很好的入门文档。Openstack 代码对我来说太难读,只好对 libvirt.org上的英文文档,做了抄袭和摘录,汇总成这一系列博文,作为学习笔记。原文在这里 https://libvirt.org/docs/libvirt-appdev-guide-python/en-US/html/
近期公司需要用vue2.0;所以就学习了一下并分享,以供参考 node npm的知识自行百度 ``` # 全局安装 vue-cli $ npm install --global vue-cli # 创建一个基于 webpack 模板的新项目 $ vue init webpack my-project # 安装依赖,走你 $ cd my-project $ npm install $ npm run dev ``` 未完待续
12.17 Nginx负载均衡 12.18 ssl原理 12.19 生成ssl密钥对 12.20 Nginx配置ssl 扩展 针对请求的uri来代理 http://ask.apelearn.com/question/1049 根据访问的目录来区分后端的web http://ask.apelearn.com/question/920 nginx长连接 http://www.apelearn.com/bbs/thread-.html nginx算法分析 http://blog.sina.com.cn/s/blog_72995dcc01016msi.htm
今天在系统定时任务中发现了一个问题,一旦修改系统时间,把系统时间调到当前时间之后(即大于当前时间T1)T2,Timer线程正常执行;如果再将系统时间修改到当前时间之前T3(即T3小于T2),那么Timer线程就会挂起,或者假死,此时不会再执行定时任务,好像线程已经死掉一样。
我们可以从Timer的实现源码中找下原因,从schedule方法进去,一直追踪调试下去,可以找到: public void run() {
mainLoop();
} finally {
// Someone killed this Thread, behave as if Timer cancelled
synchronized(queue) {
newTasksMayBeScheduled =
queue.clear();
// Eliminate obsolete references
} Timer的实现原理原来就是在一个线程中执行mainLoop()函数,再看下mainLoop()函数源码: /**
* The main timer loop.
(See class comment.)
private void mainLoop() {
while (true) {
boolean taskF
synchronized(queue) {
// Wait for queue to become non-empty
while (queue.isEmpty() ...
网页中频繁更改的内容,应该从后台动态获取,对内容较多的请求通常采用富文本编辑器来编辑内容,从而自带了样式。因此同一份内容若需要在pc和移动端同时展示,有许多差异: 页面尺寸大小: pc尺寸使用px(980,1040,...),移动端使用px或 当同时为px时,样式没有差异,而为rem时,(通常设置1rem =100px),页面通常会有缩放(0.5,大部分手机dpx&=2),导致正常大小的字体会变小;此时应禁用rem,页面宽度为屏幕宽度, 因此,为了保证富文本内容在pc和移动端同时正常显示,需要采用以下设置: 富文本编辑器默认是pc端样式(px) 而图片,表格等宽度有可能超出移动端屏幕宽度的元素,采用百分比设置他们的宽度 移动端应禁用rem,禁止缩放,让页面宽度为屏幕宽度
1:Dagger2是啥 Dagger是为Android和Java平台提供的一个完全静态的,在编译时进行依赖注入的框架,原来是由Square公司维护的然后现在把这堆东西扔给Google维护了。
一般的IOC框架都是通过反射来实现的,但Dagger2作为Android端的IOC框架,为了不影响性能,它是通过apt动态生成代码来实现的.
Dagger2主要分为三个模块: 依赖提供方Module,负责提供依赖中所需要的对象,实际编码中类似于工厂类 依赖需求方实例,它声明依赖对象,它在实际编码中对应业务类,例如Activity,当你在Activity中需要某个对象时,你只要在其中声明就行,声明的方法在下面会讲到. 依赖注入组件Component,负责将对象注入到依赖需求方,它在实际编码中是一个接口,编译时Dagger2会自动为它生成一个实现类.
Dagger2的主要工作流程分为以下几步: 将依赖需求方实例传入给Component实现类 Component实现类根据依赖需求方实例中依赖声明,来确定该实例需要依赖哪些对象 确定依赖对象后,Component会在与自己关联的Module类中查找有没有提供这些依赖对象的方法,有的话就将Module类中提供的对象设置到依赖需求方实例中 通俗上来讲就好比你现在需要一件衣服,自己做太麻烦了,你就去商店买,你跟商店老板说明你想要购买的...
你真的是一个Kotlin开发者吗?
详细解读阿里巴巴开源技术,包括框架、组件、引擎、数据库/存储、平台/系统、解决方案、工具、中间件、Web Sever、设计等十大类73款!
最近在学习Spring boot,写了个读写分离。并未照搬网文,而是独立思考后的成果,写完以后发现从零开始写读写分离并不难! 我最初的想法是: 读方法走读库,写方法走写库(一般是主库),保证在Spring提交事务之前确定数据源.
保证在Spring提交事务之前确定数据源,这个简单,利用AOP写个切换数据源的切面,让他的优先级高于Spring事务切面的优先级。至于读,写方法的区分可以用2个注解。 但是如何切换数据库呢? 我完全不知道!多年经验告诉我 当完全不了解一个技术时,先搜索学习必要知识,之后再动手尝试。
我搜索了一些网文,发现都提到了一个AbstractRoutingDataSource类。查看源码注释如下 /** Abstract {@link javax.sql.DataSource} implementation that routes {@link #getConnection()}
* calls to one of various target DataSources based on a lookup key. The latter is usually
* (but not necessarily) determined through some thread-...
# 环境要求 1、Java SDK 1.8 [下载](http://www.oracle.com/technetwork/cn/java/javase/downloads/jdk8-downloads-2133151-zhs.html) 2、Eclipse IDE for Java EE Mars 2 (4.5.2) [下载](https://www.eclipse.org/downloads/packages/eclipse-ide-java-ee-developers/mars2) 3、Apache Maven 3.3+ [下载](https://maven.apache.org/download.cgi) 4、MySql 5.7+ [下载](https://dev.mysql.com/downloads/windows/installer/5.7.html) # 导入到Eclipse 1、检出JeeSite4源代码: ``` git clone https://gitee.com/thinkgem/jeesite4.git ``` 2、拷贝`web`文件夹,到你的工作目录(不包含中文和空格的目录)下,重命名为你的工程名,如:`jeesite-demo` 3、打开`pom.xml`文件,修改第13行,artifactId为你的工程名,如:`jeesite-demo` 4、导入到Eclipse,菜单 File -& Import,然后选择 Maven -& Existing Maven Projects,点击 Next& 按钮,选择第2步的`jeesite-demo`文件夹,然后点击 Finish 按钮,即可成功导入 5、这时,Eclipse会自动加载Maven依赖包,初次加载会比较慢(根据自身网络情况而定),若工程上有小叉号,请打开Problems窗口,查看具体错误内容,直到无错误为...
# 准备阶段 ## 下载 Flutter SDK 新建 Flutter 文件夹,克隆 Flutter SDK: ```bash git clone -b beta https://github.com/flutter/flutter.git ``` ## 配置 Flutter 环境 我是 Mac 系统,Flutter SDK 下载完后的路径:Users/wuxiaolong/Flutter/flutter/ 。 ### 在命令行下,进入用户目录 ```bash cd $HOME ``` ### 打开.bash_profile文件 执行命令打开文件: ```bash open -e .bash_profile ``` 打开文件后,添加 Flutter SDK 安装的路径: ```bash export PATH=${PATH}:/Users/wuxiaolong/Flutter/flutter/bin:$PATH ``` ### 更新刚配置的环境变量 ```bash source .bash_profile ``` ### 验证 终端直接输入 flutter,没有提示该命令找不到,则配置成功。 ## flutter doctor 命令行输入`flutter doctor`,安装 Futter 剩余依赖项。 ## 安装 Flutter 和 Dart 插件 启动 Android Studio,搜索 Flutter 插件并单击 install,系统提示您安装 Dart 插件,点击 Yes 安装即可。 **提示**:安装 Dart 插件可能会提示下载失败,多试几次。 ## 第一个项目 Android Studio - File - New - New Flutter Project,等待创建成功后,运行效果如下: ![](http://7q5c2h.com1.z0.glb.clou...
  社区中并不缺少有关软件工程师职业发展的文章,甚至可以说是泛滥。很多人都能在这个话题上说两句,三五年工作经验的编程老鸟也好,架构师也好,技术 VP 也好,CTO 也好,都有各自的看法与实践经验。没有哪一套方法是适用于所有人的,这一套软件工程师职业发展纲要,也不过是在你踽踽前行的路上,迷茫时可用来参考借鉴。你的核心竞争力,永远是你的自身实力。切记! 一、专业技能学习捷径 1、爱上你的编码神器   众所周知,软件工程师要做的工作就是写代码,准确地说,你的目标应该是写出满足业务需求并且无法找出 Bug 的代码,而不是写一大堆没用的文字。既然你的任务是写出高质量的代码,那么你首先应该训练的就是打字速度,你需要掌握键盘盲打技能,甚至还要爱上你的“编码神器”,并做到将此工具的用法烂熟于心,闭上眼睛都能正确敲中你想要的快捷键。 2、熟悉底层技术原理   当你完全驾驭了计算机的输入设备以后,你需要进一步了解计算机的内部工作原理,不是让你把机器大卸八块,而是你需要全面了解计算机的组成结构与工作原理。如果你不是计算机科班出生也没关系,在网上买一本关于计算机组成原理的书自学即可。你无需做到精通,能全面了解即可,因为接下来你...
如何快速申请免费的阿里云服务器
### ElasticSearch ``` 现有三台服务器[192.168.1.30, 192.168.1.31, 192.168.1.32],使用这三台服务器搭建ElasticSearch集群 ``` #### CentOS 使用 yum 安装 ###### 编辑 repo ``` vim /etc/yum.repos.d/elasticsearch.repo # 内容如下 [elasticsearch-6.x] name=Elasticsearch repository for 6.x packages baseurl=https://artifacts.elastic.co/packages/6.x/yum gpgcheck=1 gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch enabled=1 autorefresh=1 type=rpm-md ``` ###### 使用yum安装 ``` yum install elasticsearch ``` ###### 创建用户 ``` useradd elastic ``` ###### 修改权限 ``` # 数据 chown -R elastic:elastic /var/lib/elasticsearch # 日志 chown -R elastic:elastic /var/log/elasticsearch # 配置 chown -R elastic:elastic /etc/elasticsearch chown -R elastic:elastic /etc/sysconfig/elasticsearch # 指令 chown -R elastic:elastic /usr/share/elasticsearch ``` ###### 配置 ``` # 主节点 192.168.1.30 vim /etc/elasticsearch/elasticsearch.yml # 修改以下几项 cluster.name: etl_es node.name: node-30 node.master: true node.d...
### Logstash ##### 使用yum安装 ###### 编辑 repo ``` vim /etc/yum.repos.d/elasticsearch.repo # 内容如下 [elasticsearch-6.x] name=Elasticsearch repository for 6.x packages baseurl=https://artifacts.elastic.co/packages/6.x/yum gpgcheck=1 gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch enabled=1 autorefresh=1 type=rpm-md ``` ###### 安装 ``` sudo yum install logstash ``` #### 配置 Logstash ``` # 参考 https://www.elastic.co/guide/en/logstash/current/configuration-file-structure.html # input项配置源数据,此处为监听 "/log"目录下满足"insert.*.log"匹配的所有日志文件 # filter项过滤input输入的数据, "insert.*.log"中每条日志形式如:" | type | cid | src | eventId | reason", 所以使用" | "拆分每条日志 # output项是输出数据,此处为输出至ElasticSearch # 新建配置文件 insert.conf vim conf.d/insert.conf # 内容如下 input { file { path =& "/log/insert.*.log" } } filter { mutate{ split=&["message"," | "] add_field =& { "date" =& "%{[message][0]}" } add_field =& { "type" =& "%{[message][1]...
### 新增Python3编译环境 ``` Tools & Build System & New Build System 将默认内容替换为: { "cmd": ["python3", "-u", "$file"], "file_regex": "^[ ]*File \"(...*?)\", line ([0-9]*)", "selector": "source.python" } 保存为 Python3.sublime-build ``` ### 选中Python3环境 ``` Tools & Build System & Python3 ``` ### 使用Python3编译运行 ``` Ctrl + b ``` ### 可能遇到的问题 ##### 问题 ``` UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128) ``` ##### 原因 ``` 默认是ascii编码但是输出中包含中文 ``` ##### 解决 ``` Preferences & Browse Packages & Users & Python3.sublime-build 修改配置文件, 配置文件中新增一条 "env": {"LANG": "en_US.UTF-8"} 修改后如下: { "cmd": ["python3", "-u", "$file"], "file_regex": "^[ ]*File \"(...*?)\", line ([0-9]*)", "selector": "source.python", "env": {"LANG": "en_US.UTF-8"} } ```...
## 更新model #### 需求 ``` 概览表增加"创建时间,修改时间,软删除" ``` #### 以往的方式 ###### 1. 修改model.jh, 在实体 Overview 中增加三个属性 ``` /** * 数据概览 -- 概览 */ entity Overview { id Long, ... /* 以下属性为新增的属性 */ /* 创建时间 */ createTime ZonedDateTime, /* 更新时间 */ updateTime ZonedDateTime, /* 是否删除 */ delFlag Boolean, } ``` ###### 2. 生成配置文件 ``` jhipster import-jdl model.jh ``` ###### 3. 运行项目使配置生效 ``` 运行项目时提示"Validation Failed",原因是配置文件的MD5值不同, 此时需要以下操作 1. 修改 DATABASECHANGELOG 表中相关记录的 MD5SUM 2. 在overview表中手动新增三个属性. ``` #### 现在的方式 ###### 1. 修改model.h, 在实体 Overview 中增加三个属性 ###### 2. 生成配置文件 ###### 3. 修改生成的配置文件 ``` src/main/resources/config/liquibase/changelog/15_added_entity_Overview.xml 将 changeSet中新增的三个column提取至新的changeSet中, 如下: 注意: changeSet的id不能与之前的相同 ``` ###### 4. 运行项目使配置生效 ``` 不需要手动修改MySQL,自动生效 ```...
### 1.虚拟环境 ``` tianshl:workspace tianshl$ mkdir server tianshl:workspace tianshl$ cd server/ tianshl:server tianshl$ virtualenv venv --python=python3 tianshl:server tianshl$ source venv/bin/activate ``` ### 2. 安装依赖 ``` (venv) tianshl:server tianshl$ pip install django (venv) tianshl:server tianshl$ pip install djangorestframework ``` ### 3. 创建项目 ``` (venv) tianshl:server tianshl$ django-admin.py startproject server (venv) tianshl:server tianshl$ tree server/ server ├── manage.py └── server ├── __init__.py ├── settings.py ├── urls.py └── wsgi.py ``` ### 4. 更新配置 ``` (venv) tianshl:server tianshl$ cd server/ (venv) tianshl:server tianshl$ vim server/settings.py # 1.修改 INSTALLED_APPS = ( ... 'rest_framework', ) # 2.添加 REST_FRAMEWORK = { # Use Django's standard `django.contrib.auth` permissions, # or allow read-only access for unauthenticated users. 'DEFAULT_PERMISSION_CLASSES': [ 'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly' ] }...
# django ``` # 刚写的就不复制粘贴了 https://my.oschina.net/tianshl/blog/1611257 # 列一下目录结构 root@tianshl:~# cd server/ root@tianshl:~/server# tree server server ├── db.sqlite3 ├── manage.py └── server ├── __init__.py ├── settings.py ├── urls.py └── wsgi.py ``` # gunicorn ##### 安装 ``` pip install gunicorn ``` ##### 配置 ``` # 修改django项目的settings.py INSTALLED_APPS = [ ...... 'gunicorn', ] ``` ##### 运行 ``` root@tianshl:~# cd /root/server/server/ root@tianshl:~/server/server# gunicorn --pythonpath /root/server/venv/bin/python3 -w 3 -b 0.0.0.0:80 server.wsgi # 测试能否正常运行, 然后ctrl+c结束进程 ``` # supervisor ##### 安装 ``` pip install supervisor ``` ##### 配置 ``` # 默认配置 # 使用echo_supervisord_conf命令查看默认配置 root@tianshl:~# echo_supervisord_conf # 自定义配置 root@tianshl:~# mkdir /etc/supervisor root@tianshl:~# mkdir /etc/supervisor/conf.d root@tianshl:~# echo_supervisord_conf & /etc/supervisor/supervisor.conf root@tianshl:~# vim /etc/su...
### 一.使用脚本切割 ##### 编辑脚本 ``` tianshl@tianshl nginx $ vim nginx_log_division.sh ``` ##### 脚本内容 ``` #! /bin/sh # 昨天日期 yesterday=`date -v -1d +%Y%m%d` # 日志目录 log_path="/usr/local/var/log/nginx/" # SDK日志路径 sdk_path=${log_path}sdk # 以天为单位切分日志 mv -f ${sdk_path}.log ${sdk_path}_${yesterday}.log # 重新生成日志文件 pid_path="/usr/local/var/run/nginx.pid" sudo kill -USR1 `cat ${pid_path}` ``` ##### 定时任务 ###### 切换到root身份 ``` tianshl@tianshl nginx $ sudo su root ``` ###### 编辑 crontab ``` sh-3.2# crontab -e ``` ###### crontab 添加一行 ``` 0 0 * * * sh /usr/local/var/log/nginx/nginx_log_division.sh ``` ###### 查看是否添加成功 ``` sh-3.2# crontab -l ``` ### 二.不使用脚本切割 ##### server 段增加以下代码 ``` if ($time_iso8601 ~ "(\d{4})-(\d{2})-(\d{2})") { set $time $1$2$3; } ``` ##### 日志文件路径中增加日期参数 ``` access_log /var/log/nginx/api-$time. ``` ##### 举个栗子 ``` events { worker_connections 1024; } http { server { # 监听88端口 listen 88;...
### 写在开头 ``` 使用jhipster声明的OneToMany在One的一方DTO中是没有与Many的DTO的映射关系的, 为了在One的一方DTO中使用Many的DTO, 使用以下三步解决此问题。 ``` ### 步骤 ``` 1. OneDTO 中的"mark 1"处为自己写的一对多的关系, 此处变量名称不能与实体One中相应的变量名称一致,否则编译失败。 2. OneMapper 中的"mark 2"处 uses属性添加ManyMapper。 2. OneMapper 中的"mark 3"处使用@Mapping注解声明 Entity 转 DTO 的映射关系。 ``` ### Entity ``` @Entity @Table(name = "one") public class One { ... @OneToMany(mappedBy = "one") private Set manys = new HashSet&&(); ... public void setManys(Set manys) { this.manys = } public Set getManys() { } } @Entity @Table(name = "many") public class Many { ... @ManyToOne private O } ``` ### DTO ``` public class OneDTO { ... // mark 1 private Set manyDTOS = new HashSet&&(); ... public void setManyDTOS(Set manyDTOS) { this.manyDTOS = manyDTOS; } public Set getManyDTOS() { return manyDTOS; } } public class ManyDTO { ... private Long oneId; ... public...
### 拷贝文件或文件夹 ``` /** * 拷贝文件 * * @param source 源文件 * @param target 目标文件 */ public void copyFile(String source, String target) { // 源文件 File sourceFile = new File(source); if (!sourceFile.exists()) { } // 目标文件 File targetFile = new File(target); // 文件拷贝 if (sourceFile.isFile()) { copyFromChanel(sourceFile, targetFile); } // 文件夹拷贝 if (!targetFile.exists()) { targetFile.mkdirs(); } for (File file: sourceFile.listFiles()) { copyFile(file.getAbsolutePath(), target + File.separator + file.getName()); } } ``` ### 利用文件管道拷贝文件 ``` /** * 利用文件管道拷贝文件 * * @param source 源文件 * @param target 目标文件 */ public void copyFromChanel(File source, File target) { // 文件流 FileInputStream fis = FileOutputStream fos = // 文件管道 FileChannel fci = FileChannel fco = try { // 文件流 fis = new FileInputStream(source); fos = new FileOutputStream(target); // 文件管道 fci = fis.getChannel(); fco = fos.getChannel(); ...
### 需求 ``` 对MySQL数据库中某个表的某个字段执行k-means算法,将处理后的数据写入新表中。 ``` ### 源码及驱动 ``` http://download.csdn.net/download/xiaobuding007/ ``` ### 源码 ```java import java.sql.*; import java.util.*; /** * @author tianshl * @version
上午11:13 */ public class Kmeans { // 源数据 private List origins = new ArrayList&&(); // 分组数据 private Map& // 初始质心列表 private L // 数据源 private String tableN private String colN /** * 构造方法 * * @param tableName 源数据表名称 * @param colName 源数据列名称 * @param cores 质心列表 */ private Kmeans(String tableName, String colName,List cores){ this.cores = this.tableName = tableN this.colName = colN } /** * 重新计算质心 * * @return 新的质心列表 */ private List newCores(){ List newCores = new ArrayList&&(); for(List v: grouped.values()){ newCores.add(v.stream().reduce(0, (sum, num) -& sum + num) / (v.size() + 0.0)); } Collections.sort(newCores); return newC } /...
Message Broker与AMQP简介 Message Broker是一种消息验证、传输、路由的架构模式,其设计目标主要应用于下面这些场景: 消息路由到一个或多个目的地 消息转化为其他的表现方式 执行消息的聚集、消息的分解,并将结果发送到他们的目的地,然后重新组合相应返回给消息用户 调用Web服务来检索数据 响应事件或错误 使用发布-订阅模式来提供内容或基于主题的消息路由 AMQP是Advanced Message Queuing Protocol的简称,它是一个面向消息中间件的开放式标准应用层协议。AMQP定义了这些特性: 消息方向 消息队列 消息路由(包括:点到点和发布-订阅模式) 可靠性 安全性 RabbitMQ 本文要介绍的RabbitMQ就是以AMQP协议实现的一种中间件产品,它可以支持多种操作系统,多种编程语言,几乎可以覆盖所有主流的企业级技术平台。 安装 在RabbitMQ官网的下载页面https://www.rabbitmq.com/download.html中,我们可以获取到针对各种不同操作系统的安装包和说明文档。这里,我们将对几个常用的平台一一说明。 下面我们采用的Erlang和RabbitMQ Server版本说明: Erlang/OTP 19.1 RabbitMQ Server 3.6.5 Windows安装 安装Erland,通过官方下载页面http://www.erlang.org/downloads获取exe安装包...
最近看到网上流传着,各种面试经验及面试题,往往都是一大堆技术题目贴上去,而没有答案。 为此我业余时间整理了,Java基础常见的40道常见面试题,及详细答案,望各路大牛,发现不对的地方,不吝赐教,留言即可。 1. 八种基本数据类型的大小,以及他们的封装类 1. 引用数据类型 1. Switch能否用string做参数 1. equals与==的区别 1. 自动装箱,常量池 1. Object有哪些公用方法 1. Java的四种引用,强弱软虚,用到的场景 1. Hashcode的作用 1. HashMap的hashcode的作用 1. 为什么重载hashCode方法? 1. ArrayList、LinkedList、Vector的区别 1. String、StringBuffer与StringBuilder的区别 1. Map、Set、List、Queue、Stack的特点与用法 1. HashMap和HashTable的区别 1. JDK7与JDK8中HashMap的实现 1. HashMap和ConcurrentHashMap的区别,HashMap的底层源码 1. ConcurrentHashMap能完全替代HashTable吗 1. 为什么HashMap是线程不安全的 1. 如何线程安全的使用HashMap 1. 多并发情况下HashMap是否还会产生死循环 1. TreeMap、HashMap、LindedHashMap的区别 1. Collection包结构,与Collections的区别 1. try?catch?finally,try里有return,finally还执行么 1. Excption与Err...
JDK 10 是 Java 10 标准版的部分实现,将于 2018 年 3 月 20 日发布,改进的关键点包括一个本地类型推断、一个垃圾回收的“干净”接口。
# 组织管理 ## 用户管理 用户管理是能够登录平台的账号集合,即登录用户。其最基本的属性为用户名和密码。登录用户类型分为内部员工、往来单位用户、会员用户,往来单位又分为供应商、客户、网点、院校、科研院所等。 主要功能包括:用户的维护、查询、授权角色、授权数据权限 ## 机构管理 机构管理是指组织机构也是部门,采用多级组织管理维护,无限层级,支持全国应用。 ## 公司管理 公司管理,包含以下几种场景: 1. 在财务总账中具有 “帐套”的概念; 2. 在费用预算系统中具有 “出账公司”的概念; 3. 在HR系统中具有 “合同公司” 的概念; 4. 在供应链中具有“交易公司”的概念,采用多级公司管理维护。 ## 岗位管理 岗位管理,是组织架构下的精细岗位划分,是业务流程控制、业绩考核、预警体系的基础,不同的机构、部门下的同一职务,则是不同的岗位。内部员工的属性。 主要是面向业务管理,而角色主要是针对权限功能。 # 权限管理 ## 角色管理 角色维护,是系统功能权限设置的基础,相当于权限分组,所有用户对应到相应权限角色,便具有该权限角色所赋予的所有菜单权限和操作权限。 主要功能包括:角色维护、授权功能菜单、授权数据权限、快速分配用户 ## 二级管...
Mybatis JDBC与Mysql,Oracle数据类型之间的对应关系
glibc提供了一个检查内存泄漏的方法, 前提是你的程序使用glibc的标准函数 分配内存(如malloc, alloc...):
1. 在需要内存泄漏检查的代码的开始调用void mtrace(void) (在mcheck.h中有声明). mtrace为malloc等函数安装hook, 用于记录内存分配信息. 在需要内存泄漏检查的代码的结束调用void muntrace(void).
注意: 一般情况下不要调用muntrace, 而让程序自然结束. 因为可能有些释放内存代码要到muntrace之后才运行.
2. 用debug模式编译被检查代码(-g或-ggdb)
3. 设置环境变量MALLOC_TRACE为一文件名, 这一文件将存有内存分配信息.
4. 运行被检查程序, 直至结束或muntrace被调用.
5. 用mtrace命令解析内存分配Log文件($MALLOC_TRACE) , (mtrace foo $MALLOC_TRACE, where foo is the executible name) ,如果有内存泄漏, mtrace会输出分配泄漏内存的代码位置,以及分配数量. 其他东西 1. 可以将mtrace, muntrace放入信号处理函数(USR1, USR2), 以动态地进行内存泄漏检查控制.
2. mtrace是个perl代码, 如果你对符号地址与代码文本的转换感兴趣, 可以读一下.
3. again, 尽量不要用muntrace()...
https://doc.yonyoucloud.com/doc/logstash-best-practice-cn/codec/multiline.html
详细解读阿里巴巴开源技术,包括框架、组件、引擎、数据库/存储、平台/系统、解决方案、工具、中间件、Web Sever、设计等十大类73款!
1、麦肯锡:全球最著名的管理咨询公司之一,1926年在美国成立,是专门为企业高层管理人员服务的国际性公司,在全球44个国家和地区开设了84个分公司,目前拥有9000多名咨询人员,分别来自78个国家,均具有世界著名学府的高等学位。其业务主要是提供战略方面的咨询,同时还涉足企业金融、商业技术和运营等一系列广泛的咨询领域及管理议题。麦肯锡中国公司被评为"中国最受尊敬企业"之一。
2、罗兰.贝格:罗兰o贝格国际管理咨询公司于1967年在德国建立,现已成为欧洲最大的管理咨询公司之一,隶属于德意志银行集团,在全球26个国家和地区设有35个办事处。公司的咨询顾问来自全球近四十个国家。专长于为企业提供公司战略、重建、重组、市场营销、物流营运、企业兼并后联合及人力资源管理等咨询服务,帮助您解决在市场进入战略确定、中国营运模式的建立、合资企业重建与购并、全国销售网络控制及招聘与保留人才方面的问题。
3、埃森哲:全球领先的管理及信息技术咨询机构,2003财政年度纯收入达118亿美元。拥有83,000多名员工,在全球47个国家和地区设有110多家分支机构。为各行各业的客户提供广博精深的专业服务和业务解决方案。在公司战略目标的指导下,为了全方位地满足客...
使用vscode作为golang的开发工具时需要安装几个依赖组件,当前国内网络大部分组件没法安装成功。 解决方案如下: 配置golang插件的toolsGopath为单独的目录,在该目录下新建src/golang.org/x,切换目录到x文件夹下, 执行 git clone https://github.com/golang/tools.git tools 然后重新打开vscode,进行依赖组件的安装就好。
task('dependenciesList') &&
println project.configurations.names
println "Compile dependencies"
def selectedDeps = project.configurations.compile.incoming.resolutionResult.allDependencies.collect { dep -&
"${dep.selected}"
selectedDeps.unique().sort().each { println it}
println "Test dependencies"
def testDeps = project.configurations.compile.incoming.resolutionResult.allDependencies.collect { dep -&
"${dep.selected}"
testDeps.unique().sort().each { println it}
} 参考:https://stackoverflow.com/questions//how-can-i-get-a-list-of-my-projects-dependencies-in-a-flattened-form-using-gradl...
java.io.FileNotFoundException: C:\Users\ABC\.m2\repository\com\mchange\c3p0\0.9.5.2\mchange-commons-java-0.2.11.jar (The system cannot find the file specified)
系统捕获键盘按下事件,发送事件消息到安装了事件过滤器的主窗体(相关主控件),然后执行过滤器EventFilter()函数后,传递事件到子控件,由子控件的事件处理函数,对键盘事件进行处理,再分发返回到主窗体的KeyPressEvent,从而完成整个事件的分发。
总结陈述,事件最终的归宿还是会到主窗体里面来的。
Spring、SpringMVC、Hibernate
开源、可选端到端最强加密 、聊天记录无限制云存储...
maven settings.xml文件用来对maven进行全局配置。 userSettings 只针对当前的用户。Local Repository 指向的是本机实际的maven数据仓库的地址。此地址在setting.xml中可以设置。且保持一致。 maven配置优先级从高到低:pom.xml---&profiles.xml---&user settings ---&global settings
pom文件是针对项目的局部配置。 不推荐将maven数据仓库放在c盘默认目录C:\Users\用户名\.m2\repository,方便移动数据仓库和整理c盘。 settings.xml文件中的路径设置 &localRepository&D:/repo&/localRepository& user settings.xml文件可以自行创建编写。也可使用apache maven文件中的settings.xml文件修改
maven搭建+eclipse整合
## 前言 关于Java锁细节的博客,蛮受读者欢迎的。也有许多不足,比如排版,一些细节等。Java锁细节与锁之编程细节讲述锁的两个不同方面,所以分开写。Java锁细节是讲述每种锁的细节,把锁当做人的话,讲述的是男人,女人,大人,小孩的细节。锁之编程细节讲述的如高性能的使用锁。如同让人怎么跑得块而已。 ## 大纲 编程细节如下: 1. 锁粗化 2. 锁细化 3. 保证public方法线程安全 4. 分段锁 ## 主体 关于锁粗化与锁细化,在很多关于java优化的书籍都会讲解。比如java并发编程(是老胡并发与锁的启蒙书)等等。一些读者在读Java锁细节说没有讲解锁粗化。在大家的要求,老胡只能厚着面皮写下本博客了。 大家是否觉得十分绕口,锁粗化,锁细化在名词上是两个对立的。为什么都是优化的方法了?其实可以想象成长跑,短跑。就好了。 #### 锁粗化 1. 把多次的锁合并成一个锁,减少锁消耗,提升执行性能 2. 在高并发的情况下,减少锁竞争。 & receiveIntegerNoLock 方法调用了两个声明synchronized的方法。 ```java public IntegeralInfo receiveIntegerNoLock(Integer addIntegeral) { addIntegeral(addIntegeral); addReceiveNum(); } /** * 增加积分 * * @param a...
1.什么是SolrCloud SolrCloud(solr 云)是Solr提供的分布式搜索方案,当你需要大规模,容错,分布式索引和检索能力时使用 SolrCloud。当一个系统的索引数据量少的时候是不需要使用SolrCloud的,当索引量很大,搜索请求并发很高,这时需要使用SolrCloud来满足这些需求。 SolrCloud是基于Solr和Zookeeper的分布式搜索方案,它的主要思想是使用Zookeeper作为集群的配置信息中心。 它有几个特色功能: 1)集中式的配置信息 2)自动容错 3)近实时搜索 4)查询时自动负载均衡 3. Solr集群的系统架构 ![1](https://static.oschina.net/uploads/img/04532_06xH.png "在这里输入图片标题") 3.1. 物理结构 三个Solr实例( 每个实例包括两个Core),组成一个SolrCloud。 3.2. 逻辑结构 索引集合包括两个Shard(shard1和shard2),shard1和shard2分别由三个Core组成,其中一个Leader两个Replication,Leader是由zookeeper选举产生,zookeeper控制每个shard上三个Core的索引数据一致,解决高可用问题。 用户发起索引请求分别从shard1和shard2上获取,解决高并发问题。 3.2.1. collection Collection在SolrCloud集群中是一个逻辑意义上的完整的索引结构。它常常被划分为一个或多...
http://www.mamicode.com/info-detail-573898.html
public void testMapLambda() {
Map&String, Object& map = new ConcurrentHashMap&&();
map.put("A", 10);
map.put("B", 20);
map.put("C", 30);
map.put("D", 40);
map.put("E", 50);
map.put("F", 60);
List&String& arraylist = new CopyOnWriteArrayList&&();
map.forEach((key, value) -& {
arraylist.add(key);
map.remove(key);
arraylist.stream().filter(key-& key.contains("B") || key.contains("C")).forEach(key-&{
arraylist.add(key);
arraylist.forEach(v-&{
System.out.println(v);
ViewController.m
Masonry适配
Created by asun on 16/5/24.
Copyright (C) 2016年 wuchang. All rights reserved.
#import "ViewController.h"
#import &Masonry.h&
@interface ViewController ()
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
CGFloat width = WIDTH / 5.0;
UIView *view = [[UIView alloc]init];
view.backgroundColor = [UIColor yellowColor];
[self.view addSubview:view];
[view mas_makeConstraints:^(MASConstraintMaker *make) {
make.center.equalTo(self.view);//屏幕居中
make.width.and.height.mas_equalTo(width);
UILabel *label1 = [[UILabel alloc]init];
label1.backgroundColor = [UIColor redColor];
[self.view addSubview:label1];
[label1 mas_makeConstraints:^(MASConstraintMaker *make) {
make.centerX.equalTo(view);
//X轴在控件view中居中显示
make.top.equalTo(view).offset(JWScaleY(10));
//距离顶部
make.bottom.equalTo(view)....
在学习symfony框架开发遇到问题 1、修改composer.json内容:
"post-install-cmd": [
"Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::buildBootstrap"
2、然后执行
composer install
`joe@joe-Aspire-Z3730:~/android/aosp$ repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-5.1.1_r4 .repo/manifests/: discarding 407 commits Your Name [joe]: joe Your Email [joe@joe-Aspire-Z3730.(none)]:
Your identity is: joe is this correct [y/N]? y repo has been initialized in /home/joe/android/aosp joe@joe-Aspire-Z3730:~/android/aosp$ repo sync Fetching project platform/packages/apps/VoiceDialer Fetching project platform/external/libhevc Fetching project platform/external/libxml2 Fetching project platform/external/doclava % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 curl: (22) The requested URL returned error: 404 Server does not provide clone. ignoring. Fetching projects: 0% (1/487) Fetching project platform/prebuilts/eclipse Fetching project platform/bionic Fetching project platform/external/chromium_org/third_party/angle % Total % Recei...
我们经常使用的json对象转字符串,字符串转json对象。也是属于ES5扩展的功能。代码如下: &script type="text/javascript"&
'use strict';
username:"张三",
//把对象装换为json字符串。
str = JSON.stringify(obj);
console.log(typeof str); //打印string
console.log(str);
//把json字符串转为对象
obj = JSON.parse(str);
console.log(typeof obj);//打印object
console.log(obj);
&/script& 运行如下:
最近使用`consul`作为项目的服务注册与服务发现的基础功能。在塔建集群使用中遇到一些坑,下面一个个的记录下来。 ## consul集群多node consul集群的node也就是我们所说的consul实例。集群由多个node组成,为了集群的可用性,需要超过半数的node启用server。如5个node中建议3个启用server模式,3个node组成的集群就2个node启用server模式。 看到这里的时候你一定觉得没有什么问题呀,但是consul坑就是多。加入你的集群组成如下: ``` Node Address Status Type Build Protocol DC Segment BJ-MQTEST-01 10.163.145.117:8301 alive server 1.0.6 2 iget-topology-aliyun BJ-MQTEST-02 10.163.147.47:8301 alive server 1.0.6 2 iget-topology-aliyun BJ-TGO-01 10.163.145.110:8301 alive client 1.0.6 2 iget-topology-aliyun ``` 那么client可以使用上述的3个ip连接到consul集群,假设client A使用使用10.163.145.117注册了service,重启后使用地址10.163.145.110注册之前的service信息,此时你就会惊喜的发现,UI可以同时看到在同一个servicename下存在两个相同的serviceid。 这就是consul集群多node的坑,因为service底层虽然使用了KV存储,但是service的KEY与serviceid...
由于众所周知的原因,至今仍有大量生产环境的代码跑在 Python 2.7 之上,在 Python 2 的世界里,并没有一个官方的类型系统实现。那么生产环境的类型系统是如何实现的呢,为什么一定要在在线服务上实现类型系统?下文将针对这两个问题进行深入讨论。
  社区中并不缺少有关软件工程师职业发展的文章,甚至可以说是泛滥。很多人都能在这个话题上说两句,三五年工作经验的编程老鸟也好,架构师也好,技术 VP 也好,CTO 也好,都有各自的看法与实践经验。没有哪一套方法是适用于所有人的,这一套软件工程师职业发展纲要,也不过是在你踽踽前行的路上,迷茫时可用来参考借鉴。你的核心竞争力,永远是你的自身实力。切记! 一、专业技能学习捷径 1、爱上你的编码神器   众所周知,软件工程师要做的工作就是写代码,准确地说,你的目标应该是写出满足业务需求并且无法找出 Bug 的代码,而不是写一大堆没用的文字。既然你的任务是写出高质量的代码,那么你首先应该训练的就是打字速度,你需要掌握键盘盲打技能,甚至还要爱上你的“编码神器”,并做到将此工具的用法烂熟于心,闭上眼睛都能正确敲中你想要的快捷键。 2、熟悉底层技术原理   当你完全驾驭了计算机的输入设备以后,你需要进一步了解计算机的内部工作原理,不是让你把机器大卸八块,而是你需要全面了解计算机的组成结构与工作原理。如果你不是计算机科班出生也没关系,在网上买一本关于计算机组成原理的书自学即可。你无需做到精通,能全面了解即可,因为接下来你...
最近在学习Spring boot,写了个读写分离。并未照搬网文,而是独立思考后的成果,写完以后发现从零开始写读写分离并不难! 我最初的想法是: 读方法走读库,写方法走写库(一般是主库),保证在Spring提交事务之前确定数据源.
保证在Spring提交事务之前确定数据源,这个简单,利用AOP写个切换数据源的切面,让他的优先级高于Spring事务切面的优先级。至于读,写方法的区分可以用2个注解。 但是如何切换数据库呢? 我完全不知道!多年经验告诉我 当完全不了解一个技术时,先搜索学习必要知识,之后再动手尝试。
我搜索了一些网文,发现都提到了一个AbstractRoutingDataSource类。查看源码注释如下 /** Abstract {@link javax.sql.DataSource} implementation that routes {@link #getConnection()}
* calls to one of various target DataSources based on a lookup key. The latter is usually
* (but not necessarily) determined through some thread-...
# 准备阶段 ## 下载 Flutter SDK 新建 Flutter 文件夹,克隆 Flutter SDK: ```bash git clone -b beta https://github.com/flutter/flutter.git ``` ## 配置 Flutter 环境 我是 Mac 系统,Flutter SDK 下载完后的路径:Users/wuxiaolong/Flutter/flutter/ 。 ### 在命令行下,进入用户目录 ```bash cd $HOME ``` ### 打开.bash_profile文件 执行命令打开文件: ```bash open -e .bash_profile ``` 打开文件后,添加 Flutter SDK 安装的路径: ```bash export PATH=${PATH}:/Users/wuxiaolong/Flutter/flutter/bin:$PATH ``` ### 更新刚配置的环境变量 ```bash source .bash_profile ``` ### 验证 终端直接输入 flutter,没有提示该命令找不到,则配置成功。 ## flutter doctor 命令行输入`flutter doctor`,安装 Futter 剩余依赖项。 ## 安装 Flutter 和 Dart 插件 启动 Android Studio,搜索 Flutter 插件并单击 install,系统提示您安装 Dart 插件,点击 Yes 安装即可。 **提示**:安装 Dart 插件可能会提示下载失败,多试几次。 ## 第一个项目 Android Studio - File - New - New Flutter Project,等待创建成功后,运行效果如下: ![](http://7q5c2h.com1.z0.glb.clou...
对于无状态的web服务,要做分布式部署相对比较简单,很多时候只要架一个反向代理就行。但是对于有状态的web服务,尤其是包含WebSocket成分的web应用,要做分布式部署一直是一个麻烦。传统做法是搞一个中间层,例如Redis之类的做pubsub,但是这样做就不得不改动源码。Erlang/Elixir这种“面向并发编程”的语言在这方面会不会高人一筹?Phoenix框架是否已经支持WebSocket的横向扩展了呢?下面我们就来做个实验。
在帮助小白解决了很多开源使用的问题后,我总结了小白的不科学的提问方式,以遭受9种伤害夸张的手法一一道来
微信自15年年底上线FOOM上报,每天FOOM次数与登录用户数比例接近3%,同期crash率1%不到。而16年年初某东老大反馈微信频繁闪退,接着16年8月不少外部用户反馈微信启动不久后闪退,分析大量日志还是不能找到FOOM原因。微信急需一个有效的内存监控工具来发现问题。
原文:[www.spring4all.com](http://www.spring4all.com) ### 1 线程中断 #### 1.1 什么是线程中断? 线程中断是线程的标志位属性。而不是真正终止线程,和线程的状态无关。线程中断过程表示一个运行中的线程,通过其他线程调用了该线程的 `interrupt()` 方法,使得该线程中断标志位属性改变。 深入思考下,线程中断不是去中断了线程,恰恰是用来通知该线程应该被中断了。具体是一个标志位属性,到底该线程生命周期是去终止,还是继续运行,由线程根据标志位属性自行处理。 #### 1.2 线程中断操作 调用线程的 `interrupt()` 方法,根据线程不同的状态会有不同的结果。 下面新建 InterruptedThread 对象,代码如下: ```java /** * 一直运行的线程,中断状态为 true * * @author Jeff Lee @ bysocket.com * @since 日19:03:02 */ public class InterruptedThread implements Runnable { @Override // 可以省略 public void run() { // 一直 run while (true) { } } public static void main(String[] args) throws Exception { Thread interruptedThread = new Thread(new InterruptedThread(), "InterruptedThread"); interruptedThread.start(); TimeUnit.SE...
小光是一名私家侦探,是小光侦探事务所的负责人。这天,他正在事务所中喝茶,突然接到警官M的电话,说接到线上总共三台机器,有一台机器报警,Java堆内存占用超过95%,无法正常得到服务器的响应。小光安排警官M保留好现场,急匆匆的赶往了现场...
知乎上有一个问题,内容是已知空间三个点的坐标,求三个点所构成的圆的圆心坐标(编程实现)? 根据圆的定义,这道题的核心就是找到一个点,到已知的三个点的距离相等,利用数学知识可以求解如下: 例如 :给定a(x1,y1) b(x2,y2) c(x3,y3)求外接圆心坐标O(x,y) 1. 首先,外接圆的圆心是三角形三条边的垂直平分线的交点,我们根据圆心到顶点的距离相等,可以列出以下方程:
(x1-x)*(x1-x)+(y1-y)*(y1-y)=(x2-x)*(x2-x)+(y2-y)*(y2-y);
(x2-x)*(x2-x)+(y2-y)*(y2-y)=(x3-x)*(x3-x)+(y3-y)*(y3-y); 2.化简得到:
2*(x2-x1)*x+2*(y2-y1)y=x2^2+y2^2-x1^2-y1^2;
2*(x3-x2)*x+2*(y3-y2)y=x3^2+y3^2-x2^2-y2^2;
令:A1=2*(x2-x1);
B1=2*(y2-y1);
C1=x2^2+y2^2-x1^2-y1^2;
A2=2*(x3-x2);
B2=2*(y3-y2);
C2=x3^2+y3^2-x2^2-y2^2;
即:A1*x+B1y=C1;
A2*x+B2y=C2; 3.最后根据克拉默法则:
x=((C1*B2)-(C2*B1))/((A1*B2)-(A2*B1));
y=((A1*C2)-(A2*C...
在本系列的第一篇文章中我们研究了2阶段提交协议,在本文中,我们会聚焦并发模型和隔离级别。
背景 某天 小伙伴发现一条sql巨慢无比 该sql十分长 我们来看一下 select
'1' AS type,
'项目' AS type_name,
sc.name AS businessName,
SUM(IFNULL(a.service_actual_cash,0)) AS cash,
SUM(IFNULL(a.service_actual_card,0)) AS bank_card,
SUM(IFNULL(a.service_actual_wechat,0)) AS wechat,
SUM(IFNULL(a.service_actual_alipay,0)) AS alipay,
SUM(IFNULL(a.service_actual_bank_transfer,0)) AS bank_transfer,
SUM(IFNULL(a.service_actual_account,0)) AS account,
SUM(IFNULL(a.service_actual_coupon,0)) AS coupon,
SUM(IFNULL(a.service_actual_czk,0)) AS czk,
SUM(IFNULL(a.service_actual_jck,0)) AS jck,
SUM(IFNULL(a.service_actual_tck,0)) AS tck,
SUM(IFNULL(a.service_actual_hyk,0)) AS hyk,
SUM(IFNULL(a.service_actual_owe,0)) AS owe
(SELECT sc.name,sc.id FROM dim_service_category sc
INNER JOIN dim_company_org o1 ON sc.id_own_org_dim = o1.id
LEFT JOIN dim_company_org o ON o1.company_id = o.company_id...
导语 异常处理是程序开发中必不可少操作之一,但如何正确优雅的对异常进行处理确是一门学问,笔者根据自己的开发经验来谈一谈我是如何对异常进行处理的。 由于本文只作一些经验之谈,不涉及到基础知识部分,如果读者对异常的概念还很模糊,请先查看基础知识。 如何选择异常类型 异常的类别 正如我们所知道的,java中的异常的超类是java.lang.Throwable(后文省略为Throwable),它有两个比较重要的子类,java.lang.Exception(后文省略为Exception)和java.lang.Error(后文省略为Error),其中Error由JVM虚拟机进行管理,如我们所熟知的OutOfMemoryError异常等,所以我们本文不关注Error异常,那么我们细说一下Exception异常。 Exception异常有个比较重要的子类,叫做RuntimeException。我们将RuntimeException或其他继承自RuntimeException的子类称为非受检异常(unchecked Exception),其他继承自Exception异常的子类称为受检异常(checked Exception)。本文重点来关注一下受检异常和非受检异常这两种异常。 如何选择异常 从笔者的开发经验来看,如果在一个应用中,需要开发一个方法(如某个功能的service方法),这个方法如果中间可能出现异常,那么你需要考虑这个异常出现之后是否调...
摘要: 原创出处 http://www.iocoder.cn/TCC-Transaction/transaction-recovery/ 「芋道源码」欢迎转载,保留摘要,谢谢! **本文主要基于 TCC-Transaction 1.2.3.3 正式版** - [1. 概述](http://www.iocoder.cn/TCC-Transaction/transaction-recovery/) - [2. 事务重试配置](http://www.iocoder.cn/TCC-Transaction/transaction-recovery/) - [3. 事务重试定时任务](http://www.iocoder.cn/TCC-Transaction/transaction-recovery/) - [4. 异常事务恢复](http://www.iocoder.cn/TCC-Transaction/transaction-recovery/) - [4.1 加载异常事务集合](http://www.iocoder.cn/TCC-Transaction/transaction-recovery/) - [4.2 恢复异常事务集合](http://www.iocoder.cn/TCC-Transaction/transaction-recovery/) - [666. 彩蛋](http://www.iocoder.cn/TCC-Transaction/transaction-recovery/) ------- ![](https://user-gold-cdn.xitu.io//161bc087b2b30dd1?w=750&h=330&f=jpeg&s=78520) & ???关注**微信公众号:【芋道源码】**有福利: & 1. RocketMQ / MyCAT / Sharding-JDBC **所有**源码分析文章列表 & 2. RocketMQ / MyCAT / Sharding-JDBC **中文注释源码 ...
本文目标 要在单台机器上搭建Redis集群,方式是通过不同的TCP端口启动多个实例,然后组成集群,同时记录在搭建过程中踩过的坑。 安装准备 centos版本:6.7 redis版本:3.2.3 安装方式:源码安装 服务器:1台 操作步骤 此处默认已安装好单台redis,如果不会可以参照《centos上安装redis》 1、启动Redis多个实例 我们在Redis安装目录下创建目录cluster,并编写7000.conf~7005.conf 6个配置文件,这6个配置文件用来启动6个实例,后面将使用这6个实例组成集群。 以7000.conf为例,配置文件需要填写如下几项: port
//端口02,05
bind 192.168.186.91
//默认ip为127.0.0.1 需要改为其他节点机器可访问的ip 否则创建集群时无法访问对应的端口,无法创建集群
//redis后台运行
./redis_7000.pid
//pidfile文件对应02,05
cluster-enabled
//开启集群
把注释#去掉
cluster-config-file
nodes_7000.conf
//集群的配置
配置文件首...
1.目录结构 2.repl工具 jShell命令 3.模块化 4.多版本兼容jar包 5.接口方法的改进(在接口中 jdk7 只能声明全名常量和抽象方法 jdk8 添加了静态方法和默认方法 jdk9添加了私有方法) 6.钻石操作符升级 可以有{} 7.异常处理try升级 8.下划线标识符命名的限制 _ 不允许了 9.String底层存储结构的变更(char数组变成byte字节数组) 10.增强了Stream API(在java8基础上,新增加4个方法) 11.jdk9 中引入httpClient api 代替原有的HttpURLConnection
服务注册中心,给客户端提供可供调用的服务列表,客户端在进行远程服务调用时,根据服务列表然后选择服务提供方的服务地址进行服务调用。服务注册中心在分布式系统中大量应用,是分布式系统中不可或缺的组件,例如rocketmq的name server,hdfs中的namenode,dubbo中的zk注册中心,spring cloud中的服务注册中心eureka。
在spring cloud中,除了可以使用eureka作为注册中心外,还可以通过配置的方式使用zookeeper作为注册中心。既然这样,我们该如何选择注册中心的实现呢?
著名的CAP理论指出,一个分布式系统不可能同时满足C(一致性)、A(可用性)和P(分区容错性)。由于分区容错性在是分布式系统中必须要保证的,因此我们只能在A和C之间进行权衡。在此Zookeeper保证的是CP, 而Eureka则是AP。 2. Zookeeper保证CP
当向注册中心查询服务列表时,我们可以容忍注册中心返回的是几分钟以前的注册信息,但不能接受服务直接down掉不可用。也就是说,服务注册功能对可用性的要求要高于一致性。但是zk会出现这样一种情况,当master节点因为网络故障与其他节点失去联系时,剩余节点会重新进行leader选举。问题在于,选举leader的时间太长,30 ~ 12...
前端框架很多,但没有一个框架称霸,后端框架现在Spring已经完成大一统.所以学习Spring是Java程序员的必修课.
开机要启动的脚本qidong.sh [root@c69-01 scripts]# vim /server/scripts/qidong.sh
[root@c69-01 scripts]# cat /server/scripts/qidong.sh
#!/bin/bash
/bin/echo $(/bin/date +%F_%T) && /tmp/qidong.log 方法一:修改/etc/rc.local /etc/rc.local,该文件为链接文件 [root@c69-01 ~]# ll /etc/rc.local
lrwxrwxrwx. 1 root root 13 Feb
5 10:03 /etc/rc.local -& rc.d/rc.local
修改/etc/rc.local文件 [root@c69-01 scripts]# tail -n 1 /etc/rc.local
/bin/bash /server/scripts/qidong.sh &/dev/null 2&/dev/null
重启系统,查看结果 [root@c69-01 ~]# cat /tmp/qidong.log
已开机自启动该脚本 方法二:chkconfig管理 删除掉方法一的配置 [root@c69-01 ~]# vim /etc/init.d/test
#!/bin/bash
# chkconfig: 3 88 88
/bin/bash /server/scripts/qidong.sh &/dev/null 2&/dev/null
[root@c69-01 ~]# chmod +x /etc/init.d/test
添加到chkconfig,开机自启动
[root@c69-01 ~]# chkconfig --add test [root@c69-01 ~]# chkconfig --list test
0:off 1:off 2:off 3:on 4:off 5:off 6:off
重启系统,查看结果 [root@c69-...
1.数据库连接池 什么是数据库连接池 简单来说:数据库连接池就是提供连接的。。。 为什么我们要使用数据库连接池 数据库的连接的建立和关闭是非常消耗资源的 频繁地打开、关闭连接造成系统性能低下 编写连接池 编写连接池需实现java.sql.DataSource接口 创建批量的Connection用LinkedList保存【既然是个池,当然用集合保存、、LinkedList底层是链表,对增删性能较好】 实现getConnetion(),让getConnection()每次调用,都是在LinkedList中取一个Connection返回给用户 调用Connection.close()方法,Connction返回给LinkedList
private static LinkedList&Connection& list = new LinkedList&&();
//获取连接只需要一次就够了,所以用static代码块
//读取文件配置
InputStream inputStream = Demo1.class.getClassLoader().getResourceAsStream("db.properties");
Properties properties = new Properties();
properties.load(inputStream);
String url = properties.getProperty("url");
String username = properties.getProperty("username");

我要回帖

更多关于 看字识人 的文章

 

随机推荐