(1)方法Join是干啥用的? 簡單回答,同步,如何同步? 怎么實現(xiàn)的? 下面將逐個回答。
自從接觸Java多線程,一直對Join理解不了。JDK是這樣說的:
join
public final void join(long millis)throws InterruptedException
Waits at most millis milliseconds for this thread to die. A timeout of 0 means to wait forever.
大家能理解嗎? 字面意思是等待一段時間直到這個線程死亡,我的疑問是那個線程,是它本身的線程還是調(diào)用它的線程的,上代碼:
}
結(jié)果是:
Begin sleep
joinFinish
End sleep
也就是說main線程只等1000毫秒,不管T什么時候結(jié)束,如果是t.join()呢, 看代碼:
public final void join() throws InterruptedException {
join(0);
}
就是說如果是t.join() = t.join(0) 0 JDK這樣說的 A timeout of 0 means to wait forever 字面意思是永遠等待,是這樣嗎?
其實是等到t結(jié)束后。
這個是怎么實現(xiàn)的嗎? 看JDK代碼:
/**
* Waits at most <code>millis</code> milliseconds for this thread to
* die. A timeout of <code>0</code> means to wait forever.
*
* @param millis the time to wait in milliseconds.
* @exception InterruptedException if any thread has interrupted
* the current thread. The <i>interrupted status</i> of the
* current thread is cleared when this exception is thrown. */ publicfinalsynchronizedvoid join(long millis) throws InterruptedException { long base = System.currentTimeMillis(); long now =0;
if (millis <0) { thrownew IllegalArgumentException("timeout value is negative");
}
if (millis ==0) { while (isAlive()) {
wait(0);
}
} else { while (isAlive()) { long delay = millis - now; if (delay <=0) { break;
}
wait(delay);
now = System.currentTimeMillis() - base;
}
}
}
Exception in thread "main" org.hibernate.HibernateException: Could not parse configuration: /hibernate.cfg.xml
at org.hibernate.cfg.Configuration.doConfigure(Configuration.java:1494)
at org.hibernate.cfg.Configuration.configure(Configuration.java:1428)
at org.hibernate.cfg.Configuration.configure(Configuration.java:1414)
at Test.TestDao.main(TestDao.java:21)
Caused by: org.dom4j.DocumentException: c:\ajar\hibernate-configuration-3.0.dtd (系統(tǒng)找不到指定的路徑。) Nested exception: c:\ajar\hibernate-configuration-3.0.dtd (系統(tǒng)找不到指定的路徑。)
at org.dom4j.io.SAXReader.read(SAXReader.java:484)
at org.hibernate.cfg.Configuration.doConfigure(Configuration.java:1484)
... 3 more
E:使用having關(guān)鍵字來篩選結(jié)果
當完成對數(shù)據(jù)結(jié)果的查詢和統(tǒng)計后,可以使用having關(guān)鍵字來對查詢和計算的結(jié)果進行一步的篩選
例:檢索出work表中學歷是大專或者是中專的人數(shù)
select 學歷,count(學歷) from work group by 學歷 having 學歷 in("'大專"',"'中專"')
說明:1:having關(guān)鍵字都與group by用在一起.
2:having不支持對列分配的別名
例如:select 學歷,"'大于5的人數(shù)"'=count(學歷) from work group by 學歷 having 大于5的人數(shù)>5 [錯錯]
改為:select 學歷,"'大于5的人數(shù)"'=count(學歷) from work group by 學歷 having count(學歷)>5
F:使用compute和compute by
使用compute子句允許同時觀察查詢所得到各列的數(shù)據(jù)的細節(jié)以及統(tǒng)計各列數(shù)據(jù)所產(chǎn)生的匯總列
select * from work [查詢所得到的各列的數(shù)據(jù)的細節(jié)]
compute max(基本工資),min(基本工資) [統(tǒng)計之后的結(jié)果]
這個例子中沒有使用by關(guān)鍵字,返回的結(jié)果是最后添加了一行基本工資的最大值和最小值,也可增加by關(guān)鍵字.
例:select * from work order by 學歷
compute max(基本工資),min(基本工資) by 學歷
比較:select 學歷,max(基本工資),min(基本工資) from work group by 學歷
說明:1:compute子句必須與order by子句用在一起
2:compute子句可以返回多種結(jié)果集.一種是體現(xiàn)數(shù)據(jù)細節(jié)的數(shù)據(jù)集,可以按分類要求進行正確的分類;另一種在分類的基礎(chǔ)上進行匯總產(chǎn)生結(jié)果.
3:而group by子句對每一類數(shù)據(jù)分類之后只能產(chǎn)生一個結(jié)果,不能知道細節(jié)
G:使用嵌套查詢
查詢中再查詢,通常是以一個查詢作為條件來供另一個查詢使用
例:有work表和部門表
A:檢索出在部門表中登記的所有部門的職工基本資料
select * from work where 部門編號 in [not in](select 部門編號 from dbo.部門)
B:檢索出在work表中每一個部門的最高基本工資的職工資料
select * from work a where 基本工資=(select max(基本工資) from work b where a.部門名稱=b.部門名稱)
說明:由外查詢提供一個部門名稱給內(nèi)查詢,內(nèi)查詢利用這個部門名稱找到該部門的最高基本工資,然后外查詢根據(jù)基本工資判斷是否等于最高工資,如果是的,則顯示出來.
相當于:select * from work,(select 部門名稱,max(基本工資) as 基本工資 from work group by 部門名稱 as t) where work.基本工資=t.基本工資 and work.部門名稱=t.部門名稱
C:用嵌套work表和嵌套部門表,在嵌套work表中檢索出姓名和職工號都在嵌套部門存在的職工資料
select * from 嵌套work where 職工號 in (select 職工號 from 嵌套部門) and 姓名 in (select 姓名 from 嵌套部門) [察看結(jié)果,分析原因]
改:select * from 嵌套work a,嵌套部門 b where a.職工號=b.職工號 and a.姓名=b.姓名
改:select * from 嵌套work where 職工號=(select 職工號 from 嵌套部門) and 姓名=(select 姓名 from 嵌套部門) [行嗎?為什么,分析原因?]
在嵌套中使用exists關(guān)鍵字[存在]
例:1:用嵌套work表和嵌套部門表,在嵌套work表中檢索出姓名和職工號都在嵌套部門存在的職工資料
select * from 嵌套work a where exists (select * from 嵌套部門 b where a.姓名=b.姓名 and a.職工號=b.職工號)
2:在work表檢索出在部門表沒有的職工
select * from work where not exists (select * from 部門 where 部門.部門編號=work.部門編號)
能否改成:select * from work where exists (select * from 部門 where 部門.部門編號<>work.部門編號)
在列清單中使用select
例:1:在work1表和部門表中檢索出所有部門的部門名稱和基本工資總和
select 部門名稱,(select sum(基本工資) from work1 b where a.部門編號=b.部門編號) from 部門 a
2:檢索各部門的職工人數(shù)
select 部門編號,部門名稱,(select count(職工號) from work1 a where a.部門編號=b.部門編號) as 人數(shù) from 部門 b
3:在商品表和銷售表中查詢每一職工的姓名,所屬部門,銷售總量
select 姓名,所屬部門,(select sum(銷售量) from 商品銷售 a where a.職工號=b.職工號) as 銷售總量 from 嵌套部門 b
H:分布式查詢
我們以前的查詢都只是基于一個服務器中的一個數(shù)據(jù)庫的查詢,如果一個查詢是要跨越一個服務器,像這樣的查詢就是分布式查詢,那么我們以看到分布查詢就是數(shù)據(jù)源自于兩個服務器.要進行分布式查詢必須先創(chuàng)建一個“鏈接服務器”,以便讓本地的用戶能夠映射到過程服務器.
“鏈接服務器”的創(chuàng)立
A:在“鏈接服務器”里面輸入以后為了方便訪問該鏈接服務器的名稱[任意]
B:在“提供程序名稱”里面選擇“Microsoft OLE DB Provider for SQL Server”
C:在“數(shù)據(jù)源”里面輸入服務器的網(wǎng)絡(luò)名
D:本地登錄,遠程用戶和遠程密碼里面分別輸入一個本地登錄用戶,遠程登錄和遠程密碼以便讓本地SQL Server登錄映射為鏈接服務器上的用戶
E:訪問方法:格式:鏈接服務器的名稱.數(shù)據(jù)庫名.dbo.表名
鏈接服務器有兩個特點:
1:通過鏈接服務器不能刪除鏈接源服務器的任何對像.
2:能過鏈接服務器可以對鏈接源服務器的表進行insert,updae,delete操作.
2:使用update更新視圖中的數(shù)據(jù)
1:更新視圖與更新表格一樣,但是在視圖中使用了多個基本表連接的情況下,每次更新操作只能更新來自基本表的一個數(shù)據(jù)列
例如:創(chuàng)建以下視圖:create view del as
select 職工號,姓名,部門名稱,負責人 from work1,部門
where work1.部門編號=部門.部門編號
如果再執(zhí)行下面的語句時:
update del set 職工號="'001"',部門名稱="'wenda"' where 職工號="'01"'[出現(xiàn)錯誤]
只能夠改成:update del set 職工號="'001"' where 職工號="'01"'
update del set 部門名稱="'wenda"' where 職工號="'01"'
2:不能在使用了distinct語句的視圖中更新值
3:不能在使用了group by語句的視圖中更新值
3:使用delete刪除視圖中數(shù)據(jù).
通過視圖刪除數(shù)據(jù)最終體現(xiàn)為從基本表中刪除數(shù)據(jù)
格式:delete 視圖名 [where 條件]
說明:當視圖由兩個以上的基表構(gòu)成時,不允許刪除視圖的數(shù)據(jù)
例如:建一個視圖kk
create view kk as
select 職工號,姓名,性別,部門名稱 from work1,部門 where work1.部門編號=部門.部門編號 [試著去刪除]
使用with check option的視圖
如果不了解視圖定義內(nèi)容,則常常會發(fā)生向視圖中輸入不符合視圖定義的數(shù)據(jù)的情況.
比如:create view xm as
select * from work where 性別="'男"'
完全可以插入insert xm values("'001"',"'女"',23,"'2400"'....)
盡管從意義上來說是不合理的,但是上述語句是正確的.為了防止這種情況的發(fā)生,可以使用with check option子句來對插入的或更改的數(shù)據(jù)進行限制.
比如:create view xm as
select * from work where 性別="'男"' with check option
使用schemabinding的視圖[使用綁定到構(gòu)架]
我們知道視圖是依賴于表,如果在一個表中創(chuàng)建一個視圖,今后如果這個表被刪除了,則這個視圖將不可再用了.為了防止用戶刪除一個有視圖在引用的表,可以在創(chuàng)建視圖的時候加上schemabinding關(guān)鍵字.
比如:create view 基本工資 with SCHEMABINDING
as select 姓名,性別,基本工資 from dbo.work
說明:1:不能使用“*”來創(chuàng)建此類型的視圖
2:創(chuàng)建此類型的視圖時,一定要加上dbo.表名.
3:如果在某個表中定義了此類視圖,則用戶將不能對表的結(jié)構(gòu)進行修改,否則會刪除這些綁定
4:如果用戶對表的結(jié)構(gòu)進行列改名,則會刪除綁定而且視圖不可用.
5:如果用戶對表的結(jié)構(gòu)進行列的類型或者大小修改,則會刪除綁定但視圖可用,此時用戶可以刪除視圖所引用的表.
使用with encryption對視圖進行加密
為了保護創(chuàng)建視圖定義的原代碼,可以對視圖進行加密.
比如:create view kk with encryption
as select * from work where 職稱="'經(jīng)理"'
用sp_helptext來查看一下.或用企業(yè)管理器查看一下.
說明:如果應用此項用戶將無法設(shè)計視圖
1.HIBERNATE異常
Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in class path resource [applicationContext.xml]: Invocation of init method failed; nested exception is org.hibernate.InvalidMappingException: Could not parse mapping document from input stream
Caused by: org.hibernate.InvalidMappingException: Could not parse mapping document from input stream
at org.hibernate.cfg.Configuration.addInputStream(Configuration.java:508)
at org.springframework.orm.hibernate3.LocalSessionFactoryBean.buildSessionFactory(LocalSessionFactoryBean.java:656)
at org.springframework.orm.hibernate3.AbstractSessionFactoryBean.afterPropertiesSet(AbstractSessionFactoryBean.java:134)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1203)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1172)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:427)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:249)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:155)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:246)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:160)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:285)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:352)
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:122)
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:66)
at cn.qdqn.ssh.test.AddUserInfo.main(AddUserInfo.java:25)
Caused by: org.dom4j.DocumentException: \G1:\JAR\hibernate-mapping-3.0.dtd (文件名、目錄名或卷標語法不正確。) Nested exception: \G1:\JAR\hibernate-mapping-3.0.dtd (文件名、目錄名或卷標語法不正確。)
at org.dom4j.io.SAXReader.read(SAXReader.java:484)
at org.hibernate.cfg.Configuration.addInputStream(Configuration.java:499)
... 14 more